1. 程式人生 > >設計模式之禪學習筆記02--工廠方法模式

設計模式之禪學習筆記02--工廠方法模式

1.工廠方法模式:

     定義一個用於建立物件的介面,讓子類決定例項化哪一個類,工廠方法使一個類的例項化延遲到其子類

    類圖:

                                   

    根據定義可知:

    這個模式有四個角色 :產品抽象類(介面), 工廠抽象類(介面),產品實現類,工廠實現類。工廠實現類中生產各種各樣的產品。

   2.來個例子:

   產品抽象類(介面):

package com.wx.factorymethod.baseinterface;
 /*
   所有產品的抽象介面
 */
public interface Product {
    public void show();
}

 工廠抽象類(介面):

package com.wx.factorymethod.baseinterface;
 /*
    生產所有種類產品的抽象工廠介面
 */
public abstract class FactoryMethod {
     /*
      這裡對傳入引數做了兩層限制,採用的是泛型做限制
      1.傳入的引數必須是Class型別
      2.傳入的引數必須是Product的實現類
     */
    public abstract <T extends Product> T getProuect(Class<T> c);
}

 產品實現類 

package com.wx.factorymethod.test;

import com.wx.factorymethod.baseinterface.Product;

public class Product1 implements Product {
    @Override
    public void show() {
        System.out.print("產品1的方法被呼叫");
    }
}


package com.wx.factorymethod.test;

import com.wx.factorymethod.baseinterface.Product;

public class Product2 implements Product {
    @Override
    public void show() {
        System.out.print("產品2的方法被呼叫");
    }
}

 工廠實現類

package com.wx.factorymethod.imp;

import com.wx.factorymethod.baseinterface.FactoryMethod;
import com.wx.factorymethod.baseinterface.Product;

public class FactoryMethodImp extends FactoryMethod  {
    @Override
    public <T extends Product> T getProuect(Class<T> c) {
        Product product=null;
        try{

            product=(T)Class.forName(c.getName()).newInstance();
        }catch (Exception e)
        {e.printStackTrace();}
        return (T) product;
    }
}

 測試:

package com.wx.factorymethod.test;

import com.wx.factorymethod.baseinterface.FactoryMethod;
import com.wx.factorymethod.imp.FactoryMethodImp;

public class TestFactoryMethod {
    public static void main(String[] args)
    {
        FactoryMethod factoryMethod=new FactoryMethodImp();
        Product1 prouect = factoryMethod.getProuect(Product1.class);
        Product2 product2 = factoryMethod.getProuect(Product2.class);
        prouect.show();
        product2.show();
    }
}

 結果:

這是一個比較通用的工廠方法模式可以對其進行弱化和強化

3.工廠方法模式的使用場景:

 萬物皆物件,那麼萬物也是產品類,都可以使用工廠方法模式。

4.工廠方法模式的擴充套件:

  1. 簡單工廠模式,也稱為靜態工廠模式

       不要工廠抽象類,直接在工廠實現類中把實現抽象類的方法改為靜態的方法。缺點就是工廠類擴充套件比較困難不符合開閉原則。

  1. 升級為多個工廠類,如果產品的初始化差異大,就為每一個產品都搞一個生產工廠類。也不再需要泛型,因為有明確的指向。
  2. 替代單例模式和多例模式:

       可以在工廠方法中通過反射來實現單例物件

 5.總結

     工廠方法模式的優點:

  1. 良好的封裝性,降低模組的耦合。
  2. 擴充套件性好
  3. 遮蔽了產品類,產品類的實現如何變化呼叫者都不需要關心,呼叫者都不要關心,只要介面不變,上層模組就不會變