淺析 抽象工廠、Factory 方法、簡單(靜態)工廠

來源:互聯網
上載者:User

標籤:原廠模式   抽象工廠   Factory 方法   設計模式   繼承   

----簡單工廠(也叫靜態原廠模式):一個抽象產品抽象出多個具體產品類,一個具體工廠類
代碼:
//抽象產品角色public interface Car{      public void drive();}//具體產品角色public class Benz implements Car{      public void drive() {         System.out.println("Driving Benz ");      }}public class Bmw implements Car{      public void drive() {       System.out.println("Driving Bmw ");      }}//工廠類角色public class Driver{            //Factory 方法.注意 傳回型別為抽象產品角色             public static Car driverCar(String s)throws Exception{                   //判斷邏輯,返回具體的產品角色給Client                   if(s.equalsIgnoreCase("Benz"))                        return new Benz();                   else if(s.equalsIgnoreCase("Bmw"))                            return new Bmw();                                 ......                              else throw new Exception();             。。。//歡迎暴發戶出場......public class Magnate{             public static void main(String[] args){                        try{                              //告訴司機我今天坐平治                                                      Car car = Driver.driverCar("benz");                              //下命令:開車                                                             car.drive();                        。。。


----Factory 方法    Factory 方法:一抽象產品類派生出多個具體產品類;一抽象工廠類派生出多個具體工廠類;每個具體工廠類只能建立一個具體產品類的執行個體。

    即定義一個建立對象的介面(即抽象工廠類),讓其子類(具體工廠類)決定執行個體化哪一個類(具體產品類)。“一對一”的關係。


(圖中的實線表示繼承錯了,應該是虛線,表示實現)

Factory 方法:

public interface Product{       }public interface Creator{       public Product factory();}public class ConcreteProduct1 implements Product{       public ConcreteProduct1()       {              System.out.println("ConcreteProduct1被建立");       }}public class ConcreteProduct2 implements Product{       public ConcreteProduct2()       {              System.out.println("ConcreteProduct2被建立");       } }public class ConcreteCreator1 implements Creator{       public Product factory()       {              return new ConcreteProduct1();       }}public class ConcreteCreator2 implements Creator{       public Product factory()       {              return new ConcreteProduct2();       }} public class Client{       private static Creator creator1, creator2;       private static Product prod1, prod2;       public static void main(String[] args)       {              creator1 = new ConcreteCreator1();              prod1 = creator1.factory();              System.out.println("----------------------------");              creator2 = new ConcreteCreator2();              prod2 = creator2.factory();       }}


----抽象工廠

    抽象工廠:多個抽象產品類,派生出多個具體產品類;一個抽象工廠類,派生出多個具體工廠類;每個具體工廠類可建立多個具體產品類的執行個體。

    即提供一個建立一系列相關或相互依賴對象的介面,而無需指定他們的具體的類。“一對多”的關係。


優點:

1、抽象原廠模式隔離了具體類的生產,使得客戶並不需要知道什麼被建立。

2、當一個產品族中的多個對象被設計成一起工作時,它能保證用戶端始終只使用同一個產品族中的對象。

3、增加新的具體工廠和產品族很方便,無須修改已有系統,符合“開閉原則”。

 

缺點:

增加新的產品等級結構很複雜,需要修改抽象工廠和所有的具體工廠類,對“開閉原則”的支援呈現傾斜性。


適用環境:

1、一個系統不應當依賴於產品類執行個體如何被建立、組合和表達的細節,這對於所有類型的原廠模式都是重要的。

2、系統中有多於一個的產品族,而每次只使用其中某一產品族。

3、屬於同一個產品族的產品將在一起使用,這一約束必須在系統的設計中體現出來。

4、系統提供一個產品類的庫,所有的產品以同樣的介面出現,從而使用戶端不依賴於具體實現。

抽象工廠:

//定義不同的產品之間的一定具備的標準,用interface實現 //其中的method()方法可看作提取出不同產品的共性,如手機都有類似的功能 interface IProductA{   public void method(); } interface IProductB{   public void method(); } //實現了產品標準實現的一系列具體產品 //由於已經設計好A1由廠商1生產,故以下輸出代碼有“廠商x” class ProductA1 implements IProductA{   public void method() {     System.out.println("廠商1    生產ProductA1 ...");   } } class ProductA2 implements IProductA{   public void method() {     System.out.println("廠商2    生產ProductA2 ...");   } } class ProductB1 implements IProductB{   public void method() {     System.out.println("廠商1    生產ProductB1 ...");   } } class ProductB2 implements IProductB{   public void method() {     System.out.println("廠商2    生產ProductB2 ...");   } } //每一種牌子的產品生產工廠,即不同的廠商負責自己牌子產品的生產 abstract class Factory1{   abstract IProductA getProductA1();   abstract IProductB getProductB1(); } abstract class Factory2{   abstract IProductA getProductA2();   abstract IProductB getProductB2(); } //具體的工廠用來生產相關的產品 class ConcreteFactory1 extends Factory1{   public IProductA getProductA1() {     return new ProductA1();   }   public IProductB getProductB1() {     return new ProductB1();   } } class ConcreteFactoryB extends Factory2{   public IProductA getProductA2() {     return new ProductA2();   }   public IProductB getProductB2() {     return new ProductB2();   } } //測試類別 public class Client {   public static void main(String[] args) {     //廠商1負責生產產品A1、B1     Factory1 factory1 = new ConcreteFactory1();     IProductA productA1 = factory1.getProductA1();     IProductB productB1 = factory1.getProductB1();          productA1.method();     productB1.method();          //廠商2負責生產產品A2、B2     Factory2 factory2 = new ConcreteFactoryB();     IProductA productA2 = factory2.getProductA2();     IProductB productB2 = factory2.getProductB2();          productA2.method();     productB2.method();   } }


    抽象Factory 方法從縱向上看,幾乎沒有可擴充性,假如我們想增加一個產品C,也就是說產品家族由原來的2個變為3個,程式將會有很大的變動,抽象工廠中就需要增加一個方法。這嚴重違背了開閉原則。並且抽象類別是不喜歡被修改的。

    但是從橫向上來看,卻對擴充性有了很好的支援,如果我們增加一個產品等級3,我們只需要在寫一個Create3就可以了,這裡又符合了開閉原則,有多少個產品等級就應該有多少個實現工廠類。每增加一個產品等級就相應的增加一個實現工廠類,這裡的擴充性又很自然的體現出來了。



應用情境

Factory 方法:

在以下情況下,適用於Factory 方法模式:

(1) 當一個類不知道它所必須建立的對象的類的時候。

(2) 當一個類希望由它的子類來指定它所建立的對象的時候。

(3) 當類將建立對象的職責委託給多個協助子類中的某一個,並且你希望將哪一個協助子類是代理者這一資訊局部化的時候。


抽象工廠:

(1) 一個系統不應當依賴於產品類執行個體如何被建立、組合和表達的細節,這對於所有形態的原廠模式都是重要的。

(2) 這個系統有多於一個的產品族,而系統只消費其中某一產品族。

(3) 同屬於同一個產品族的產品是在一起使用的,這一約束必須在系統的設計中體現出來。

(4) 系統提供一個產品類的庫,所有的產品以同樣的介面出現,從而使用戶端不依賴於實現。


轉載請註明出處:http://blog.csdn.net/df1012890048/article/details/38672341

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.