標籤:

設計模式解析—工廠模式

設計模式解析—工廠模式

工廠模式細分三種:簡單工廠模式、工廠模式、抽象工廠模式。

工廠模式相當於抽象了簡單工廠模式的工廠類,而抽象工廠模式在工廠模式的基礎上加上了產品族的概念。

簡單工廠模式

定義

又名靜態方法模式,是由一個工廠對象決定創建出哪一種產品類的實例。

實現

用生產手機為例,假設有小米手機、華為手機兩個類型的手機。

我們先定義手機的基類

interface IPhone { void call();}

然後實現小米、華為兩個手機類

class MiPhone implements IPhone { @Override public void call() {}}class HwPhone implements IPhone { @Override public void call() {}}

接著,我們創建一個簡單工廠類

class PhoneFactory { public static IPhone phone; public static IPhone produce(String phoneType) { switch (phoneType) { case "mi": phone = new MiPhone(); break; case "huawei": phone = new HwPhone(); break; default: phone = null; } return phone; }}

這樣外部可以傳入不同的字元串來調用工廠類的靜態方法創建不同具體產品類的實例

IPhone miPhone = PhoneFactory.produce("mi");IPhone HwPhone = PhoneFactory.produce("huawei");

UML圖是

image.png

簡單工廠模式的運用,可以使創建實例和使用實例的過程分開,使用不用關心類對象如何創建的,實現了解耦。但如果要添加新產品,就要修改工廠類的邏輯,造成工廠內部邏輯過於複雜,且違背了「開放-關閉」原則

工廠模式

根據上述所說,簡單工廠模式,在增加新的產品時,需要修改我們的工廠類,違反了對擴展開放、對修改的關閉的原則。由此,產生了工廠模式。

工廠模式的思想是將工廠類抽象出一個基類,根據不同的產品,創建不同的工廠類。

定義

在工廠方法模式中,核心的工廠類不再負責所有的產品的創建,而是將具體創建的工作交給子類去做。該核心類成為一個抽象工廠角色,僅負責給出具體工廠子類必須實現的介面,而不接觸哪一個產品類應當被實例化這種細節。

實現

還是用生產手機為例,假設有小米手機、華為手機兩個類型的手機。

我們先定義手機的基類

interface IPhone { void call();}

然後實現小米、華為兩個手機類

class MiPhone implements IPhone { @Override public void call() {}}class HwPhone implements IPhone { @Override public void call() {}}

上面和簡單工廠模式相同,接下來我們先創建一個工廠類的介面,讓不同的子類去實現它。

interface IPhoneFactory { IPhone produce();}

然後創建生產小米手機的工廠類和生產華為手機的工廠類去實現 PhoneFactory

class MiPhoneFactory implements IPhoneFactory { @Override public IPhone produce() { return new MiPhone(); }}class HwPhoneFactory implements IPhoneFactory { @Override public IPhone produce() { return new HwPhone(); }}

這樣外部可以通過創建不同的工廠類來生產不同的產品,在增加新的產品時,不會修改原有的代碼,只需要創建新的產品類實現產品介面,創建新的產品工廠類實現工廠介面。

IPhone miPhone = new MiPhoneFactory().produce();IPhone hwPhone = new HwPhoneFactory().produce();

UML圖是

image.png

工廠模式和簡單工廠模式一樣,對使用者而言,不需要關心產品實例的創建過程,只需要關心產品的介面。

抽象工廠模式

定義

為創建一組相關或相互依賴的對象提供一個介面,而且無需指定他們的具體類。

這一組相關或者相互依賴的對象有一個名詞來形容就是產品族。

實現

還是生產手機的例子,為了解釋產品族,我們要新增一類產品—手機套,小米、華為手機的手機兩個手機套是不一樣的。

我們先定義手機的介面

interface IPhone { void call();}

然後實現小米、華為兩個手機類

class MiPhone implements IPhone { @Override public void call() {}}class HwPhone implements IPhone { @Override public void call() {}}

定義手機套的介面

interface IPhoneCase { void call();}

然後實現小米、華為兩個手機套類

class MiPhoneCase implements IPhoneCase { @Override public void protect() {}}class HwPhoneCase implements IPhoneCase { @Override public void protect() {}}

因為手機和手機套之間不能混用,所以對應的工廠生產對應的手機套是最合適的。

我們先創建工廠介面,其中定義了兩個方法,用於生成不用的產品。

interface IPhoneFactory { IPhone producePhone(); IPhoneCase producePhoneCase();}

然後創建生產小米手機的工廠類和生產華為手機的工廠類去實現 PhoneFactory

class MiPhoneFactory implements IPhoneFactory { @Override public IPhone producePhone() { return new MiPhone(); } @Override public IPhoneCase producePhoneCase() { return new MiPhoneCase(); }}class HwPhoneFactory implements IPhoneFactory { @Override public IPhone producePhone() { return new HwPhone(); } @Override public IPhoneCase producePhoneCase() { return new HwPhoneCase(); }}

抽象工廠模式除了具有工廠方法模式的優點外,最主要的優點就是可以在類的內部對產品族進行約束。所謂的產品族,一般或多或少的都存在一定的關聯,抽象工廠模式就可以在類內部對產品族的關聯關係進行定義和描述,而不必專門引入一個新的類來進行管理。


推薦閱讀:

結構型模式之代理模式
音頻節目第三期——設計模式
面向新手的雜談:Flyweight(續)
Spring框架中的設計模式(五)

TAG:設計模式 |