深入理解Java設計模式之抽象工廠模式

一、什麼是抽象工廠模式

為創建一組相關或相互依賴的對象提供一個接口,而且無需指定他們的具體類。

抽象工廠模式是所有形態的工廠模式中最為抽象和最具一般性的一種形態。抽象工廠模式是指當有多個抽象角色時,使用的一種工廠模式。

抽象工廠模式可以向客戶端提供一個接口,使客戶端在不必指定產品的具體的情況下,創建多個產品族中的產品對象。

根據裡氏替換原則,任何接受父類型的地方,都應當能夠接受子類型。因此,實際上系統所需要的,僅僅是類型與這些抽象產品角色相同的一些實例,而不是這些抽象產品的實例。

換言之,也就是這些抽象產品的具體子類的實例。工廠類負責創建抽象產品的具體子類的實例。

二、抽象工廠模式的應用場景

當一個對象都有相同的約束時,可以使用抽象工廠模式。
打個比方說,這個工廠的幾個產品都需要經過某些共同的步驟和打上相同的商標,這一組產品可以在一個工廠裡面生產,減少很多重復的代碼在不同的地方都出現多次。

三、抽象工廠模式和工廠方法模式對比

抽象工廠模式的定義:為創建一組相關或相互依賴的對象提供一個接口,而且無需指定它們的具體類。

工廠方法模式的定義:為某個對象提供一個接口,而且無需指定它們的具體類。

都是子類實現接口的方法,並在子類寫具體的代碼。

工廠方法模式中也是可以有多個具體工廠,也是可以有多個抽象產品,和多個具體工廠、具體產品類。

區別是在抽象工廠接口類中,能創建幾個產品對象。
抽象工廠模式的工廠能創建多個相關的產品對象,而工廠方法模式的工廠隻創建一個產品對象。

四、抽象工廠模式的優缺點

優點:

1.它分離瞭具體的類

2.它使得易於交換產品系列

3.它有利於產品的一致性

缺點:

難以支持新種類的產品。

抽象方法模式的最大缺點就是產品族本身的擴展非常困難。如果在產品族中增加一個新的產品類型,則需要修改多個接口,並影響現已有的工廠類。

上面這句話,有些人不怎麼理解,我給大傢解釋一下,打個比方說,你要在這個工廠創建三個對象,原本隻是創建兩個對象的,那麼你就要在抽象方法中添加一個創建對象的方法,那麼所有實現瞭這個接口的類都是要重新添加這個創建對象的方法,這就是對之前的工廠有影響的原因。

五、抽象工廠模式的實現

首先是抽象工廠,生產對象的抽象。

public abstract class AbstractFactory {
    abstract Size getSize();
}

下面是具體工廠

public class IphoneXFactory: AbstractFactory{
     Size getSize() {
        return new IphoneXSize();
    }
}
 public class IphoneXRFactory: AbstractFactory{
     Size getSize() {
        return new IphoneXRSize();
    }
}
 public class HuaWeiMate10Factory: AbstractFactory{
     Size getSize() {
        return new HuaWeiMate10Size();
    }
}
 public class XiaoMi8Factory: AbstractFactory{
     Size getSize() {
        return new XiaoMi8Size();
    }
}

下面是對象抽象出來的接口

public interface Size {
    public void getSize();
}

最後是我們要生產的對象

public class IphoneXSize: Size {
     public void getSize() {
        System.out.println("IphoneX尺寸.");
    }
}
public class IphoneXRSize: Size {
     public void getSize() {
        System.out.println("IphoneXR尺寸.");
    }
}
public class HuaWeiMate10Size: Size {
     public void getSize() {
        System.out.println("HuaWeiMate10尺寸.");
    }
}
public class XiaoMi8Size: Size {
     public void getSize() {
        System.out.println("小米8尺寸.");
    }
}

客戶端調用

public class Test {
    public  static void main(String args[]){
        AbstractFactory factory = new IphoneXFactory();
        factory.getSize(); 
    }
}

六、總結

工廠模式可以分為:簡單工廠模式工廠方法模式抽象工廠模式

簡單工廠模式就沒什麼好說的瞭,無非是所有的東西都寫在一個類裡面,要什麼就調用什麼,如果要添加新的方法也是到這類裡面添加,代碼很多,看起來也是很亂,就像一個大工廠,什麼都在裡面。擴展性很低。

而工廠方法模式,把說明的理論和生產的東西就分開一點。抽象工廠模式是工廠方法模式的升級。

工廠模式與抽象工廠模式都屬於創建型模式,在工廠模式中彌補瞭簡單工廠模式的缺陷(不符合開閉原則),而在抽象工廠模式中彌補瞭工廠模式的不足(一個工廠隻能生產一種產品)。

本篇文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!

推薦閱讀: