工廠方法模式
1. 回顧簡單工廠模式
在簡單工廠模式中是把所有的產品集中到一個工廠類中創建完成,而使用者只需要關心傳入工廠類的產品標識,即可創建不同的產品;並且簡單工廠中提出了三角色,分別是:抽象產品角色(抽象類:abstract class,接口:interfac)是所有具體產品角色的基類、具體產品角色是創建目標、工廠角色是根據使用者傳入的產品標識創建所需的產品對象實例。
簡單工廠模式的弊端就是隨着產品的增加,而工廠類的判斷邏輯也相對越來越複雜,及其不利於擴展和維護。如何解決這個問題的哪?
2. 啥時候使用工廠方法模式
你工廠的效益越來越好,產品不斷增加,生產效率不能提升,廠長很苦惱;廠長靈機一動,咱也小有資產了,咱爲嘛不再搞個廠子嘛(廠長的野心比較大);於是他又搞了個專門生產蘋果手機的廠子,並把原廠改爲生產小米手機的廠子,這樣每個廠子都負責一塊生產效率上去了。
3. 工廠方法模式定義
工廠方法模式(Factory Mthod Pattern)又稱爲工廠模式或多態工廠模式(Polymorphic Factory),它屬於類創建型模式。是定義一個創建產品對象的工廠接口,將實際創建工作推遲到子類當中。核心工廠類不再負責產品的創建,這樣核心類成爲一個抽象工廠角色,僅負責具體工廠子類必須實現的接口,這樣進一步抽象化的好處是使得工廠方法模式可以使系統在不修改具體工廠角色的情況下引進新的產品。
分析:工廠方法模式提供了一個基類工廠,而基類工廠只負責生產產品的公共接口方法,具體產品的生產由具體工廠負責生產,而所有具體產品都有一個抽象產品基類。
舉個例子:工廠基類就相當於一個集團,集團下轄很多的生產工廠,但是每個生產工廠只能生產一種類型的產品;
4. 該模式中包含的角色及其職責
1)、Factory:抽象工廠角色
是工廠方法模式的核心,與應用程序無關。任何在模式中創建對象的工廠必須實現這個接口。
2)、ConcreteFactory:具體工廠角色
這是實現抽象工廠接口的具體工廠類,包含與應用程序密切相關的邏輯,並且受到應用程序調用以創建產品對象。
3)、Product:抽象產品角色
工廠方法模式所創建對象的基類,也就是產品對象的共同父類或共同擁有的接口。
)4、ConcreteProduct:具體產品角色
這個角色實現了抽象產品角色所定義的接口。某具體產品有專門的具體工廠創建,它們之間往往一一對應。
不廢話了,看下面代碼!
5. 擼代碼
PHP代碼哦
/**
* 抽象產品角色:IProduct
*
*/
interface IProduct
{
/**
* 抽象產品角色提供的 公共接口 創建手機
*/
public function createMobilePhone();
}
/**
* 具體產品角色:ConcreteIPhoneProduct 生產蘋果手機
*
*/
class ConcreteIPhoneProduct implements IProduct
{
/**
* 抽象產品角色提供的 公共接口 創建蘋果手機
*/
public function createMobilePhone(){
//具體實現代碼
}
}
/**
* 具體產品角色:ConcreteXiaomiProduct 生產小米手機
*
*/
class ConcreteXiaomiProduct implements IProduct
{
/**
* 抽象產品角色提供的 公共接口 創建小米手機
*/
public function createMobilePhone(){
//具體實現代碼
}
}
/**
* 抽象工廠方法角色:IFactory
*
*/
interface IFactory
{
/**
* 抽象工廠方法角色提供 公共接口方法 創建手機
*/
public function createMobilePhone();
}
/**
* 具體工廠角色:ConcreteXiaomiFactory 生產小米手機
*
*/
class ConcreteXiaomiFactory implements IFactory
{
/**
* 抽象工廠方法角色提供 公共接口方法 創建小米手機
* @return IProduct
*/
public function createMobilePhone(){
return new ConcreteXiaomiProduct();
}
}
/**
* 具體工廠角色:ConcreteIPhoneFactory 生產蘋果手機
*
*/
class ConcreteIPhoneFactory implements IFactory
{
/**
* 抽象工廠方法角色提供 公共接口方法 創建蘋果手機
* @return IProduct
*/
public function createMobilePhone(){
return new ConcreteIPhoneProduct();
}
}
/**
* 測試工廠方法模式
*
*/
class TestFactoryMethod
{
//測試方法
public function Test(){
//創建蘋果手機
$iphone = (new ConcreteIPhoneFactory())->createMobilePhone();
//創建小米手機
$xiaomi = (new ConcreteXiaomiFactory())->createMobilePhone();
}
}
6. 工廠方法模式的優點
工廠方法用來創建使用者所需要的產品實例,工廠方法向使用者隱藏了對具體產品類的實例化細節,用戶者之需要關心所需要的產品對應的具體工廠即可。
系統中新增產品時,無需修改抽象工廠和抽象產品提供的接口,無需修改具體工廠和具體產品,而只需添加一個具體的工廠和具體產品即可。
7. 工廠方法模式的缺點
添加新產品時,需要編寫新的具體產品類,而且還需要提供與之對應的具體工廠類,這樣系統中類的個數將成對增加,在一定的程度上增加了系統的複雜度。
8. 使用場景
對於某個產品,調用者清楚地知道應該使用哪個具體工廠服務,實例化該具體工廠,生產出具體的產品。
只是需要一種產品,而不想知道也不需要知道究竟是哪個工廠爲生產的,即最終選用那個具體工廠的決定權在使用者一方,它們根據當前系統的情況來實例化一個具體的工廠返回給使用者,而這個決策過程對於使用者來說是透明的。
9. 總結
工廠方法模式又稱爲工廠模式,它屬於創建型模式。是定義一個創建產品對象的工廠接口,將實際創建工作推遲到子類當中。核心工廠類不再負責產品的創建,這樣核心類成爲一個抽象工廠角色,僅負責具體工廠子類必須實現的接口,這樣進一步抽象化的好處是使得工廠方法模式可以使系統在不修改具體工廠角色的情況下引進新的產品。
工廠方法模式有四種角色,抽象工廠角色、具體工廠角色、抽象產品角色和具體產品角色組成。
工廠方法模式的具體工廠類必須有一個基類,同時具體工廠類創建的具體產品必須出自同一個基類(抽象產品角色)
新增產品類時,只需要添加具體產品類和具體工廠方法類,是成對出現的。