工廠方法模式
工廠方法模式,即定義一個用於創建對象的接口,讓子類決定實例化哪個類。
//定義抽象產品類
public abstract class Product{
public abstract void method();
}
//定義具體產品類
public class ConProduct extends Product{
public void method(){}
}
//定義抽象工廠類
public abstract class Factory{
public abstract <T extends Product> T createProduct(Class<T> c);
//泛型,所有繼承Product的類
}
//具體工廠類
public class ConFactory extends Factory{
public <T extends Product> T createProduct(Class<T> c){//工廠函數
Product product=null;
try{
product=(Product)Class.forName(c.getName()).newInstance();//內省
}catch(Exception e){//異常處理}
return (T)product;
}
}
工廠方法模式封裝良好,結構清晰,易於擴展。是典型的解耦框架,高層模塊只需要知道產品的抽象類,符合迪米特法則和依賴倒置原則,只依賴產品類的抽象,也符合里氏替換原則。工廠方法模式擴展
延遲初始化是工廠方法模式的一個擴展,對象創建後在類內保存引用,在下次創建對象時查找類內是否存在,有則直接取出返回
簡單工廠模式Simple Factory Pattern,去除抽象工廠類,將生產函數設爲static。
多工廠模式,每個具體產品對應一個共產類,類職責清晰,結構簡單,但增加了擴展難度。替代單例模式,符合單一職責原則
簡單工廠模式Simple Factory Pattern,去除抽象工廠類,將生產函數設爲static。
多工廠模式,每個具體產品對應一個共產類,類職責清晰,結構簡單,但增加了擴展難度。替代單例模式,符合單一職責原則
public class Singleton{
private Singleton();
}
public class SingletonFactory{
private static Singleton singleton;
static{
try{
//通過反射方式創建單例類
Class cl = Class.forName(Singleton.class.getName());
//獲得無參構造
Constructor con = c1.getDeclaredConstructor();
//設置無參構造可訪問
con.setAccessible(true);
//產生實例
singleton = (Singleton)con.newInstance();
}catch(Exception e){//異常處理}
}
public static Singleton getSingleton()
{
return singleton;
}
}