本文是本人對這三種模式學習後的一個小結以及對他們之間的區別的理解。 java
簡單工廠 設計模式
簡單工廠模式的工廠類通常是使用靜態方法,經過接收的參數的不一樣來返回不一樣的對象實例。 api
不修改代碼的話,是沒法擴展的。 架構
代碼示例: ide
public interface Api { void doSomething(String thing); } public class ImpA implements Api { @Override public void doSomething(String thing) { System.out.println("ImpA thing ="+thing); } } public class ImpB implements Api{ @Override public void doSomething(String thing) { System.out.println("ImpB thing ="+thing); } } public class Factory { public static Api createApi(int condition){ Api api = null; if (condition==1) api = new ImpA(); if (condition == 2) { api = new ImpB(); } return api; } } /** * 簡單工廠本質:選擇實現! * * 簡單工廠優勢: * * 1:幫助封裝 * 2:解耦 * * 簡單工廠缺點: * * 1:不方便擴展子工廠, * 2:增長客戶端難度,由於客戶端要知道參數表明的 功能和含義,也部分暴露了內部實 現,這種狀況建議使用可配置的方式實現。 */ public class Client { public static void main(String[] args) { Api api = Factory.createApi(2); api.doSomething("正在使用簡單工廠"); } }
工廠方法 學習
工廠方法是針對每一種產品提供一個工廠類。經過不一樣的工廠實例來建立不一樣的產品實例。 優化
在同一等級結構中,支持增長任意產品。 spa
public interface FactoryMethod { Product createProduct(); } public class FactoryA implements FactoryMethod { @Override public Product createProduct() { return new CreateProductA(); } } public class FactoryB implements FactoryMethod { @Override public Product createProduct() { return new CreateProductB(); } } public class CreateProductA implements Product { @Override public void opration1() { System.out.println("ProductA.opration1"); } @Override public void opration2() { System.out.println("ProductA.opration2"); } } public interface Product { void opration1(); void opration2(); } public class CreateProductB implements Product { @Override public void opration1() { System.out.println("ProductB.opration1"); } @Override public void opration2() { System.out.println("ProductB.opration2"); } }
FactoryMethod factory = new FactoryA();
Product product = factory.createProduct();
product.opration1();
抽象工廠 設計
抽象工廠是應對產品族概念的。好比說,每一個汽車公司可能要同時生產轎車,貨車,客車,那麼每個工廠都要有建立轎車,貨車和客車的方法。 code
應對產品族概念而生,增長新的產品線很容易,可是沒法增長新的產品。
小結
★工廠模式中,重要的是工廠類,而不是產品類。產品類能夠是多種形式,多層繼承或者是單個類都是能夠的。但要明確的,工廠模式的接口只會返回一種類型的實例,這是在設計產品類的時候須要注意的,最好是有父類或者共同實現的接口。
★使用工廠模式,返回的實例必定是工廠建立的,而不是從其餘對象中獲取的。
★工廠模式返回的實例能夠不是新建立的,返回由工廠建立好的實例也是能夠的。
區別
簡單工廠 : 用來生產同一等級結構中的任意產品。(對於增長新的產品,無能爲力)
工廠方法 :用來生產同一等級結構中的固定產品。(支持增長任意產品)
抽象工廠 :用來生產不一樣產品族的所有產品。(對於增長新的產品,無能爲力;支持增長產品族)
以上三種工廠 方法在等級結構和產品族這兩個方向上的支持程度不一樣。因此要根據狀況考慮應該使用哪一種方法