1. 程式人生 > >java設計模式大話之工廠方法模式

java設計模式大話之工廠方法模式

    由於簡單工廠模式中工廠類集中了所有例項的建立邏輯,違反了高內聚責任分配原則,將全部建立邏輯集中到了一個工廠類中;它所能建立的類只能是事先考慮到的,如果需要新增新的類,則就需要改變工廠類了。

當系統中的具體產品類不斷增多時候,可能會出現要求工廠類根據不同條件建立不同例項的需求.這種對條件的判斷和對具體產品型別的判斷交錯在一起,很難避免模組功能的蔓延,對系統的維護和擴充套件非常不利;

這些缺點在工廠方法模式中得到了一定的克服。

   工廠方法模式:定義一個建立產品物件的工廠介面,讓子類決定例項化哪一種例項物件,將建立例項物件的工作放在具體子類工廠,核心的工廠類將不再負責具體產品的的建立,也就是一個抽象工廠定義了一個建立產品的介面,至於具體建立哪種產品它不知道,產品的例項化被放到了具體的工廠子類中。

    下面我們以一個生活中的例子來闡述這個模式:假設小明是個富二代,大學畢業後拿了老爸的50萬投資了一個小吃店,賣炸雞漢堡之類的小吃,他的目標很巨集大,要把小吃店幹成KFC那樣的連鎖店,目標很巨集大,路要一步一步走,剛開始的小店,模式很簡單,客人來了之後根據選單上的品種來點餐,點了之後小明現場做,說到這,大家是不是很快想起來了,這個不就是簡單工廠模式嗎,小明的這家店就是一個簡單的工廠,客戶是具體的消費者,來了之後客戶不需要知道店裡面的小吃具體怎麼做的,有什麼配方,只需要跟小明說一聲。模式很簡單,適合單店。


小明很勤勞,加上配方正宗,生意異常火爆,不多久就賺了不少錢,開了不少分店,但是問題也慢慢凸顯,產品品種單一,花式不多,每一次上新品,每個點都要重新引進裝置,人員培訓,修改選單宣傳頁,代價很大。小明這時候痛定思痛決定引進中央廚房,由中央廚房統一把食品的胚胎,原型做出來,統一配送到每個店鋪,店鋪只要做最後的加工,裝飾,不同花樣的產品就能方便快捷的到客戶的手中,一舉解決了所有問題,小明的連鎖夢想越來越接近現實了。


 // 產品介面,對應例子裡面的產品坯胎,初加工產品
  interface IProduct { 
    public void create(); 
    
  } 
    
  // 具體的產品實現類 。漢堡,炸雞,飲料
  public class ProductA implements IProduct { 
    public void create() { 
      System.out.println("ConcreteProductA is Coming!!"); 
    } 
  } 
    
  public class ProductB implements IProduct { 
    public void create() { 
      System.out.println("ProductB is Coming!!"); 
    }     
  } 
    
  // 抽象的工廠類,定義了其子類必須實現的createProduct()方法 ,對應就是中央廚房
  public abstract class Factory { 
    public abstract <T extends IProduct> T createProduct(Class<T> c); 
  } 
  
  //具體工廠類,對應一個個分店  
  public class ConcreteFactory extends Factory { 
    public <T extends IProduct> T createProduct(Class<T> c) { 
      T product = null; 
      try { 
        product = (T) Class.forName(c.getName()).newInstance(); 
      } catch (Exception e) { 
        e.printStackTrace(); 
      } 
      return product; 
    } 
  } 
    
  public class Customer{ 
    public static void main(String[] args) { 
      //建立一個具體分店 ,這邊也可以再加上另外一家分店
      Factory factory = new ConcreteFactory(); 
      //根據引數中具體產品的.class名稱來決定建立的產品型別 
      IProduct product01 = factory.createProduct(ConcreteProductA.class); 
      IProduct product02 = factory.createProduct(ConcreteProductB.class);         
      product01.create();  
      product02.create();  
    } 
}
上面的例子就結束了,以後中央廚房負責建立初加工的各種產品,然後每一家分店在這個基礎上做個簡單的加工,消費者就能方便快捷的吃到美味可口的美食了。