標籤:分享圖片 責任 ati 黃金 TE code color err 工廠
前言
上篇部落格介紹了簡單原廠模式和Factory 方法模式,這次介紹抽象原廠模式,抽象原廠模式和Factory 方法模式的區別在於需要建立對象的複雜程度上。
抽象原廠模式
抽象原廠模式是圍繞著一個超級工廠建立其他工廠。這個超級工廠被稱為其他工廠的工廠,主要是為瞭解決介面選擇問題。
舉例說明:
還是繼續上篇使用者使用手的例子,現在生產手機的工廠發現,不同的手機使用的配件也不相同,需要單獨的生產配件。例如iphonX使用的原深感網路攝影機,以及OLED顯示屏,而iphone8使用的全新感光元件組成的網路攝影機,以及視網膜高清顯示屏。這樣就需要通過每個配件的配件工廠來提供相應的配件。為了在寫代碼執行個體時取名稱簡單,暫且定義iphoneX使用的是A網路攝影機和A顯示器,而iphone8使用的是B網路攝影機和B感應器。
代碼執行個體如下:
顯示器
/** * 顯示屏介面 */public interface Display {}
/** * iphoneX顯示器 */public class ADisplay implements Display { public ADisplay(){ System.out.println("##### 製造OLED顯示屏 #####"); }}
/** * iphone8顯示器 */public class BDisplay implements Display { public BDisplay(){ System.out.println("##### 製造高清視網膜顯示器 #####"); }}
網路攝影機
/** * 網路攝影機介面 */public interface Camera {}
/** * iphoneX網路攝影機 */public class ACamera implements Camera { public ACamera(){ System.out.println("##### 製造原深感網路攝影機 #####"); }}
/** * iphone8網路攝影機 */public class BCamera implements Camera{ public BCamera(){ System.out.println("##### 製造搭配全新感光組件的網路攝影機 #####"); }}
工廠類
/** * 抽象工廠類 */public abstract class AbstractFactory { /** * 獲得顯示屏 * @return */ public abstract Display getDisplay(); /** * 獲得網路攝影機 * @return */ public abstract Camera getCamera();}
/** * iphoneX配件工廠類 */public class IphoneXPartsFactory extends AbstractFactory{ /** * 獲得顯示屏 * * @return */ @Override public Display getDisplay() { return new ADisplay(); } /** * 獲得網路攝影機 * * @return */ @Override public Camera getCamera() { return new ACamera(); }}
/** * iphone8配件工廠類 */public class Iphone8PartsFactory extends AbstractFactory{ /** * 獲得顯示屏 * * @return */ @Override public Display getDisplay() { return new BDisplay(); } /** * 獲得網路攝影機 * * @return */ @Override public Camera getCamera() { return new BCamera(); }}
使用者類
/** * 使用者類 */public class Customer { /** * 製造配件 * @param af */ public static void madeIphone(AbstractFactory af){ //製造iphone的配件 af.getDisplay(); af.getCamera(); } public static void main(String[] args) { AbstractFactory iphonePartsFactory = new IphoneXPartsFactory(); //製造iPhoneX 的配件 madeIphone(iphonePartsFactory); iphonePartsFactory = new Iphone8PartsFactory(); //製造iPhone8 的配件 madeIphone(iphonePartsFactory); }}
運行結果:
##### 製造OLED顯示屏 ########## 製造原深感網路攝影機 ########## 製造高清視網膜顯示器 ########## 製造搭配全新感光組件的網路攝影機 #####
原廠模式也是屬於建立模式,它是Factory 方法模式的進一步推廣。在當一個子系統需要一些產品對象,而這些產品又屬於一個以上的產品等級結構,那麼為了將消費這些產品對象的責任和黃金這些產品對象的責任分割開來,這個時候就可以使用抽象原廠模式了。這樣在使用產品的一方不要直接參与產品的建立工作,而只需要向一個公用的工廠介面請求所需要的產品。
原廠模式的關係類圖如下:
抽象原廠模式中的角色和Factory 方法模式中的角色是一樣的,這裡就不介紹了,可以看上一篇Factory 方法模式的角色介紹。
抽象原廠模式的優點和缺點優點:分離介面和實現
用戶端使用抽象工廠來建立需要的對象,而用戶端根本就不知道具體的實現是誰,用戶端只是面向川普的介面編程而已。也就是說,用戶端從具體的產品實現中解耦出來了。
使切換產品族變得容易
因為一個具體的工廠實現代表的是一個產品族,比如上面例子的從iphoneX的配件到iphone8的配件只需要切換一下具體工廠。
缺點:
抽象原廠模式的缺點是不太容易擴充新的產品。如果需要給整個產品族添加一個新的產品,那麼久需要修改抽象工廠,這樣就會導致修改所有的工廠實作類別。
Java設計模式學習記錄-抽象原廠模式