標籤:[] 方法 img 類型 turn tar 重複 png factory
接著上一次的Factory 方法模式講。
假設目前你的程式裡面有三個對象IphoneX、IphoneXs、IphoneXR的尺寸,那麼你使用原廠模式就已經足夠了,因為她們屬於同一個品類,都屬於蘋果,如果在添加一個IPhone2019產品,也只需要把IPhone2019加入到你的蘋果工廠裡面就夠了。
但是如果你程式裡面還需要知道華為mate10或者小米8的尺寸。這時候你怎麼來建立這些對象呢?這時候原廠模式明顯已經不適用了,因為原廠模式是對象都實現了同一個介面,這時候就可以使用抽象原廠模式了。
一、什麼是抽象原廠模式
為建立一組相關或相互依賴的對象提供一個介面,而且無需指定他們的具體類。
抽象原廠模式是所有形態的原廠模式中最為抽象和最具一般性的一種形態。抽象原廠模式是指當有多個抽象角色時,使用的一種原廠模式。
抽象原廠模式可以向用戶端提供一個介面,使用戶端在不必指定產品的具體的情況下,建立多個產品族中的產品對象。
根據裡氏替換原則,任何接受父類型的地方,都應當能夠接受子類型。因此,實際上系統所需要的,僅僅是類型與這些抽象產品角色相同的一些執行個體,而不是這些抽象產品的執行個體。
換言之,也就是這些抽象產品的具體子類的執行個體。工廠類負責建立抽象產品的具體子類的執行個體。
二、抽象原廠模式的應用情境
當一個對象都有相同的約束時,可以使用抽象原廠模式。
打個比方說,這個工廠的幾個產品都需要經過某些共同的步驟和打上相同的商標,這一組產品可以在一個工廠裡面生產,減少很多重複的代碼在不同的地方都出現多次。
三、抽象原廠模式和Factory 方法模式對比
抽象原廠模式的定義:為建立一組相關或相互依賴的對象提供一個介面,而且無需指定它們的具體類。
Factory 方法模式的定義:為某個對象提供一個介面,而且無需指定它們的具體類。
都是子類實現介面的方法,並在子類寫具體的代碼。
Factory 方法模式中也是可以有多個具體工廠,也是可以有多個抽象產品,和多個具體工廠、具體產品類。
區別是在抽象工廠介面類中,能建立幾個產品對象。
抽象原廠模式的工廠能建立多個相關的產品對象,而Factory 方法模式的工廠只建立一個產品對象。
四、抽象原廠模式的優缺點
優點: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(); }}六、總結原廠模式
原廠模式可以分為:簡單原廠模式,Factory 方法模式,抽象原廠模式。
簡單原廠模式就沒什麼好說的了,無非是所有的東西都寫在一個類裡面,要什麼就調用什麼,如果要添加新的方法也是到這類裡面添加,代碼很多,看起來也是很亂,就像一個大工廠,什麼都在裡面。擴充性很低。
而Factory 方法模式,把說明的理論和生產的東西就分開一點。抽象原廠模式是Factory 方法模式的升級。
總結:原廠模式與抽象原廠模式都屬於建立型模式,在原廠模式中彌補了簡單原廠模式的缺陷(不符合開閉原則),而在抽象原廠模式中彌補了原廠模式的不足(一個工廠只能生產一種產品)。
深入理解設計模式(五):抽象原廠模式