解決方案
1 簡單工廠來解決
用來解決上述問題的乙個合理的解決方案就是簡單工廠,那麼什麼是簡單工廠呢?
1:簡單工廠定義
2:應用簡單工廠來解決的思路
分析上面的問題,雖然不能讓模組外部知道模組內的具體實現,但是模組內部是可以知道實現類的,而且建立介面是需要具體實現類的。
那麼乾脆在模組內部新建乙個類,在這個類裡面來建立介面,然後把建立好的介面返回給客戶端,這樣外部應用就只需要根據這個類來獲取相應的介面物件,然後就可以操作介面定義的方法了。把這樣的物件稱為簡單工廠,就叫factory吧。
這樣一來,客戶端就可以通過這個factory來獲取需要的介面物件,然後呼叫介面的方法來實現需要的功能,而且客戶端也不用再關心具體實現了。
2.2 簡單工廠結構和說明
簡單工廠的結構如圖5所示:
定義客戶所需要的功能介面
impl:
具體實現api的實現類,可能會有多個
factory:
工廠,選擇合適的實現類來建立api介面物件
client:
客戶端,通過factory去獲取api介面物件,然後面向api介面程式設計
2.3 簡單工廠示例**
(1)先看看api的定義,示例**如下:
/**
* 介面的定義,該介面可以通過簡單工廠來建立
*/public
inte***ce
api
(2)定義了介面,該來實現它了,impla的示例**如下:
/**
* 介面的具體實現物件a
*/public
class
impla
implements
api
}
implb的示意實現和impla基本一樣,示例**如下:
/**
* 介面的具體實現物件b
*/public
class
implb
implements
api
}
(3)該來看看簡單工廠的實現,示例**如下:
/**
* 工廠類,用來創造api物件
*/public
class
factory else
if(condition == 2)
return api;
} }
(4)再來看看客戶端的示意,示例**如下:
/**
* 客戶端,使用api介面
*/public
class
client
}
2.4 使用簡單工廠重寫示例
要使用簡單工廠來重寫前面的示例,主要就是要建立乙個簡單工廠物件,讓簡單工廠來負責建立介面物件。然後讓客戶端通過工廠來獲取介面物件,而不再由客戶端自己去建立介面的物件了。
此時系統的結構如圖6所示。
(1)介面api和實現類impl都和前面的示例一樣,就不去贅述了。
(2)新建立乙個簡單工廠的物件,示例**如下:
/**
* 工廠類,用來創造api物件
*/public
class
factory
}
(3)使用簡單工廠
客戶端如何使用簡單工廠提供的功能呢?這個時候,客戶端就不用再自己去建立介面的物件了,應該使用工廠來獲取,經過改造,客戶端**如下:
/**
* 客戶端:測試使用api介面
*/public
class
client
}
就如同上面的示例,客戶端通過簡單工廠建立了乙個實現介面的物件,然後面向介面程式設計,從客戶端來看,它根本就不知道具體的實現是什麼,也不知道是如何實現的,它只知道通過工廠獲得了乙個介面物件,然後就能通過這個介面來獲取想要的功能。
事實上,簡單工廠能幫助我們真正開始面向介面程式設計,像以前的做法,其實只是用到了介面的多型那部分的功能,最重要的「封裝隔離性」並沒有體現出來。
created by 呂偉朋
「工廠模式」 2
3.4 工廠方法 有了簡單工廠模式後,已經給我們帶來了一些好處,但是還存在一些問題,如果我們又多了乙個影像家電產品mp4之後,我們可以使mp4類從videowiring派生,但是卻要修改create類的 使它能夠生產出mp4這個產品來。不好的地方就在於,我們每次多乙個產品的時候都需要修改create...
2 工廠模式
意圖 定義乙個類來負責建立其他類的例項,被建立的例項通常都具有共同的父類 三個角色 1.抽象產品 2.具體產品 實現抽象產品 3.工廠類 建立產品例項的具體邏輯 情景 其實不止英雄聯盟,其他很多遊戲都是,在你名字建好之後,系統會預設彈出乙個選項框 0.第一次玩 1.我是大神 選擇0會自動進入新手教學...
設計模式2 工廠模式
定義 定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類,工廠方法使乙個類的例項化延遲到其子類。型別 建立型模式 類圖 工廠方法模式 inte ce iproduct class product implements iproduct inte ce ifactory class factory ...