java設計模式--工廠模式
阿新 • • 發佈:2019-01-10
1.工程模式定義
這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。
在工廠模式中,我們在建立物件時不會對客戶端暴露建立邏輯,並且是通過使用一個共同的介面來指向新建立的物件。
一個用於建立物件的介面,讓子類決定例項化哪一個類。工廠方法使一個類的例項化延伸到其子類。
工程模式的思路:
1.設計一個公共的介面;
2.分別設計具體的類去實現介面;
3.設計一個類來決定決定例項化哪一個工廠物件;(工廠類)
工廠模式類圖:
如圖所示,Commodity抽象類負責定義產品的共性,實現對事物最抽象的定義,Creator為抽象工廠類,具體如何建立產品類由具體的實現工廠SpecificCreator來完成。我們來看一下通用的模板程式碼:
public abstract class Commodity {
public void Method(){//公共的方法,不需要實現。
System.out.println("我是公共方法");
};
public abstract void PersonalMethod();//私有方法,需要具體實現
}
具體商品類可以有多個,都繼承與抽象類Commodity,如下:
public class SpecificCommodityA extends Commodity { @Override public void PersonalMethod() { System.out.println("我要實現A商品"); } } public class SpecificCommodityB extends Commodity{ @Override public void PersonalMethod() { System.out.println("我要實現B商品"); } }
抽象工廠負責商品具體物件的生產 ,如下
public abstract class Creator {
public abstract <T extends Commodity> T getSpecificCommodityA(Class<T> clazz);
}
具體的工廠繼承抽象工廠類,重寫其中的方法,建立不同的具體商品物件。
public class SpecificCreator extends Creator{ @Override public <T extends Commodity> T getSpecificCommodityA(Class<T> clazz) { Commodity com = null; try { com = (Commodity)Class.forName(clazz.getName()).newInstance(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return (T)com; } }
通過這樣的設計就可以生產不同的產品物件,測試類如下:
public class FactoryTest {
public static void main(String[] args) {
Creator creator = new SpecificCreator();
Commodity A = creator.getSpecificCommodityA(SpecificCommodityA.class);
Commodity B = creator.getSpecificCommodityA(SpecificCommodityB.class);
A.Method();
B.Method();
A.PersonalMethod();
B.PersonalMethod();
}
}
下面是輸入結果:
我是公共方法
我是公共方法
我要實現A商品
我要實現B商品
2.工廠模式的優點和缺點
優點:
1、一個呼叫者想建立一個物件,只要知道其名稱就可以了。
2、擴充套件性高,如果想增加一個產品,只要擴充套件一個工廠類就可以。
3、遮蔽產品的具體實現,呼叫者只關心產品的介面。
缺點:
每次增加一個產品時,都需要增加一個具體類和物件實現工廠,使得系統中類的個數成倍增加,
在一定程度上增加了系統的複雜度,同時也增加了系統具體類的依賴。這並不是什麼好事。