工廠方法模式,抽象工廠模式,簡單實例分析

爲了更好地理解這兩個模式,自己假設了如下場景,可能有些牽強,但應該還好。嘿嘿。
 
Acer,Lenovo兩家本本製造商,假設原來有一OEM兩個牌子的本本都做,這時,無論你想買那種牌子的,都可以直接向OEM購買。
可是後來該OEM商發現,如果一次同時做很多個牌子的本本,有些不利於管理,而且,如果以後要加入新的品牌的話,要有許多設備上的改動,等等原因,於是,它決定衍生出些子廠,每個子廠只做一種牌子的本本,而OEM核心總部,只負責制定規範,即,每個子廠要完成的所有任務。
 
該OEM的初始狀態,就是靜態工廠方法的場景,自己負責一切生產任務,根據外界的需求,去製造本本。
後來,爲了便於管理,和把引入新品牌後產生的變動降到最低,採取了工廠方法模式。即,核心的工廠不再負責創建等具體動作,把這些派發給自己的子工廠。而核心工廠,僅負責制定規範。
 
1.工廠方法模式
 
首先,定義產品接口,Laptop,當然,也可以是個抽象類。

點擊(此處)摺疊或打開

  1. package factoryMethod;

  2. abstract public class Laptop {
  3.     
  4.     private String mark;

  5.     public Laptop(String str){
  6.         
  7.         this.mark = str;
  8.         
  9.     }
  10.     
  11.     abstract public String getId();
  12.     
  13.     public void echoMark(){
  14.         
  15.         System.out.println("this is a "+mark+" Laptop");
  16.         
  17.     }

  18. }

有了產品接口,我們就可以去定義那個核心工廠接口

點擊(此處)摺疊或打開

  1. package factoryMethod;

  2. public interface LaptopFactory {
  3.     
  4.     public Laptop produce();
  5.     
  6.     public void service();

  7. }
如代碼所示,核心工廠規定了它子類要完成的行爲,即,製造本本,和售後服務。
下面,是具體產品類,比如Acer品牌的本本


點擊(此處)摺疊或打開

  1. package factoryMethod;

  2. public class AcerLaptop extends Laptop {

  3.     
  4.     private static final String mark = "Acer";
  5.     protected static int initId;
  6.     
  7.     public AcerLaptop() {
  8.         super(AcerLaptop.mark);
  9.         AcerLaptop.initId = 10001;
  10.     }

  11.     public String getId() {

  12.         return "Acer--"+(AcerLaptop.initId++);

  13.     }

  14. }
再來個Lenovo的本本

點擊(此處)摺疊或打開

  1. package factoryMethod;

  2. public class LenovoLaptop extends Laptop {

  3.     private static final String mark = "Lenovo";
  4.     protected static int initId;
  5.     
  6.     public LenovoLaptop() {

  7.         super(LenovoLaptop.mark);
  8.         LenovoLaptop.initId = 20001;
  9.     }

  10.     public String getId() {

  11.         return "Lenovo--"+(LenovoLaptop.initId++);

  12.     }

  13. }

其實Laptop定義的抽象方法沒什麼具體意義,該例子只爲描述工廠方法模式。
 
下面,來定義具體工廠,Acer的,和Lenovo的,裏面的方法同樣沒什麼太大意義,只爲測試。
 
 

點擊(此處)摺疊或打開

  1. package factoryMethod;

  2. public class AcerFactory implements LaptopFactory {

  3.     @Override
  4.     public Laptop produce() {
  5.         
  6.         return new AcerLaptop();//生產Acer的本本
  7.         
  8.     }

  9.     @Override
  10.     public void service() {
  11.         
  12.         System.out.println("welcom to Acer hotline ");

  13.     }

  14. }


點擊(此處)摺疊或打開

  1. public class LenovoFactory implements LaptopFactory{
  2.     
  3.     public Laptop produce(){
  4.         
  5.         return new LenovoLaptop();//生產lenovo的本本
  6.         
  7.     }
  8.     
  9.     public void service(){
  10.         
  11.         System.out.println("welcom to Lenovo hotline ");
  12.         
  13.     }

  14. }

來一個測試類。

點擊(此處)摺疊或打開

  1. package factoryMethod;

  2. public class Client {

  3.         public static void main(String[] args) {
  4.             
  5.             LenovoFactory lf = new LenovoFactory();
  6.             AcerFactory af= new AcerFactory();
  7.             Laptop lt1 = lf.produce();
  8.             Laptop lt2 = lf.produce();
  9.             Laptop lt3 = af.produce();
  10.             Laptop lt4 = af.produce();
  11.             
  12.             
  13.             lf.service();
  14.             System.out.println(lt1.getId());
  15.             System.out.println(lt2.getId());
  16.             System.out.println("--------------");
  17.             af.service();
  18.             System.out.println(lt3.getId());
  19.             System.out.println(lt4.getId());

  20.         }
  21. }

打印結果如下

點擊(此處)摺疊或打開

  1. welcom to Lenovo hotline 
  2. Lenovo--20001
  3. Lenovo--20002
  4. --------------
  5. welcom to Acer hotline 
  6. Acer--10001
  7. Acer--10002

過了一段時間,該OEM決定除了做本本,也做手機。而且OEM核心工廠決定改變下現有策略,每個子工廠做同一品牌的兩個產品,例如,子工廠A做Acer的手機和本本。
這時,有了同族產品的概念,即某些產品是一個產品族的,這裏就是指同一個品牌的。
 
爲了完成這一變更,就要是用抽象工廠方法了。這個要比前一個複雜一些,所以先畫了一個uml圖。
 
 
 
-工廠接口,AbstractFatory,指定了子類要實現的製造本本,製造手機的方法
-具體工廠類,AcerFactory,LenovoFactory,均實現了上述方法,每個具體工廠負責一個產品族。
-MobilePhone抽象類,指定Phone產品的一些屬性特徵,Laptop同理。
-Phone與Laptop屬於不同等級的產品,但是同一品牌的Phone和Laptop是同一產品族的產品,在此例中。
 
這裏就不再羅列代碼了,uml圖可以比較清晰的說明每個角色間的關係。
總結起來,引用百度百科的一句話,抽象工廠模式使用同一個 工廠等級結構負責不同產品等級結構產品對象的創建。
 
----------------------------------------------------------------------------
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章