設計模式學習 工廠方法模式

2021-08-20 20:58:26 字數 2648 閱讀 8371

設計六大原則

簡單工廠模式

上篇學習了簡單工廠模式,簡單工廠模式的優點就是工廠類封裝具體物件的實現邏輯,會根據外部傳入的選擇條件來判斷返回對應的具體物件,也就是呼叫者無需關心內部實現邏輯,只需傳入所需物件的型別即可,同樣的缺點也很明顯,如果要通過工廠類的獲取所需的具體物件,必須在工廠類中的靜態方法先定義該型別才行,如果新增了型別,就要修改此前的靜態方法中的判斷語句,需要增加乙個if或者case語句,來定義新型別,這樣才能獲取到新型別的具體物件,這就違背了設計模式的開放封閉原則

工廠方法模式的引入就是解決簡單工廠模式的缺陷,與此同時,工廠方法模式也繼承了簡單工廠模式的優點。

定義乙個用於建立物件的介面(或者抽象類),讓子類實現介面或者繼承抽象類,最後決定例項化哪個類。工廠方法使乙個類的例項化延遲到其子類。

使用步驟與簡單工廠模式型別,只不過多出了乙個抽象工廠類及實現類。在定義的抽象工廠需要用到泛型和反射。

建立抽象類或者介面,定義需要的方法。

建立具體產品類,繼承於抽象類或實現介面。

建立抽象工廠類,定義帶返回型別的抽象方法。

建立具體工廠類,繼續於抽象工廠類,實現抽象方法。

外部呼叫,先例項化具體工廠類,呼叫具體工廠類中的方法並傳入產品類的class類物件,並可獲取具體產品類的例項。

具體例項場景,還在以簡單工廠模式中的玩具場景為準。

1、建立抽象類,定義生產玩具的方法

public

abstract

class product

2、建立具體產品類,用於實現玩具的生產。

public

class

carproduct

extends

product

}public

class

aircraftproduct

extends

product

}public

class

trainproduct

extends

product

}

3、建立抽象工廠類,定義帶返回product型別的抽象方法。

public

abstract

class

toyproductfactory

4、建立具體工廠類,繼承於toyproductfactory類,並實現該抽象工廠類的方法。

public

class

hzwtoyproductfactory

extends

toyproductfactory catch (exception e)

//為了方便測試觀察,加入了客戶型別並輸出

system.out.println(clienttype);

//呼叫product物件的created方法,輸出客戶需要的玩具產品

product.created();

system.out.println("---------------");

return (t) product;}}

5、建立hzwtoyproductfactory例項,並呼叫createtoyproduct方法,傳入客戶需要的玩具產品及客戶型別即可生產對應的玩具。

hzwtoyproductfactory productfactory = new hzwtoyproductfactory();

carproduct carproduct = productfactory.createtoyproduct(carproduct.class, "客戶1");

productfactory.createtoyproduct(trainproduct.class, "客戶2");

productfactory.createtoyproduct(aircraftproduct.class, "客戶3");

productfactory.createtoyproduct(aircraftproduct.class, "客戶4");

最後執行結果如下:

客戶1

玩具汽車已經生產完畢

---------------

客戶2玩具火車已經生產完畢

---------------

客戶3玩具飛機已經生產完畢

---------------

客戶4玩具飛機已經生產完畢

---------------

從上面可知,不管客戶型別新增多少,都可以生產客戶想要的玩具產品,不用再去修改之前的工廠類來滿足新客戶的要求。

在定義抽象工廠時使用了反射和泛型,如何要使用反射和泛型,主要有以下優勢:

在未知型別的情況下,可以通過反射動態類載入得到具體例項,比如每個客戶需要的玩具產品都不一樣。而泛型是避免強制型別轉換異常的出現。

泛型與反射具體應用

感謝:

《大話設計模式》、《android高階之光》

設計模式學習 工廠方法模式

工廠方法模式,定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類,工廠方法使乙個類的例項化延遲到了其子類。之前的簡單工廠模式雖說也非常好,但是在新增和更改生產選項的時候,不得不更改switch和case語句,這點違背了設計模式的開方 封閉的原則。工廠方法模式,既克服了簡單工廠違背開方 封閉原則的缺...

學習設計模式 工廠方法模式

說明 工廠方法跟簡單工廠的區別在於簡單工廠方法在構造的時候,通過判斷輸入引數,例項化不同車物件,而工廠方法新增不同車的工廠,客戶端在呼叫的時候控制例項化哪個車工廠。需求 跟簡單工廠模式一樣,要開不同的車 解決方式 a.乙個開車父類,定義乙個開車方法 b.分別定義子類開奧迪車 開賓士車 開寶馬車 繼承...

設計模式學習 工廠方法模式

工廠方法模式也是乙個很常見 很基礎的設計模式,屬於建立型模式。它遮蔽了建立物件的細節,使用者可以直接使用,而不用去關心具體的實現邏輯。define an inte ce for creating an object,but let subclasses decide which class to i...