設計模式之禪學習筆記02--工廠方法模式
阿新 • • 發佈:2018-12-21
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.工廠方法模式的擴充套件:
- 簡單工廠模式,也稱為靜態工廠模式
不要工廠抽象類,直接在工廠實現類中把實現抽象類的方法改為靜態的方法。缺點就是工廠類擴充套件比較困難不符合開閉原則。
- 升級為多個工廠類,如果產品的初始化差異大,就為每一個產品都搞一個生產工廠類。也不再需要泛型,因為有明確的指向。
- 替代單例模式和多例模式:
可以在工廠方法中通過反射來實現單例物件
5.總結
工廠方法模式的優點:
- 良好的封裝性,降低模組的耦合。
- 擴充套件性好
- 遮蔽了產品類,產品類的實現如何變化呼叫者都不需要關心,呼叫者都不要關心,只要介面不變,上層模組就不會變