學習GOF23種設計模式,從學習簡單工廠開始是個不錯的選擇,簡單工廠雖不屬於GOF設計模式中的一種,但它在開發中是很是經常使用的,也充分體現了面向對象開發的要點和好處,因此理解簡單工廠,對於後面學習其它的模式是很是有幫助的。html
1、引出模式編程
咱們時常據說面向對象開發很厲害,因此在開發中咱們會時不時嘗試用面向對象的方法去開發程序,而後,就會遇到這種狀況:面對對象開發,咱們要有接口,咱們要有實現接口的具體類,用的時候咱們要遵循面向接口編程。因而乎就出現了這種狀況:設計模式
IAnimal animal = new Dog(); animal.Call();
哈哈,這不就是面向接口進行編程了嗎?固然,這可不是面向接口編程,雖然你使用了接口,但不表明就是面向接口編程。咱們一塊兒來圍觀下吧。這段代碼一般是寫在客戶端的,因而乎,客戶端既知道接口,又知道了具體的實現類。有何問題?咱們仍是先來回顧一下接口最主要的做用吧!沒錯,就是「封裝隔離」,具體的實現類被接口所封裝並使其與客戶端隔離,也就是說,客戶端不該該知道具體實現類的存在。若是不能像上面這樣作的話,客戶端如今只知道一個接口,那我怎麼纔可以獲得接口的對象呢?函數
2、簡單工廠工具
1.咱們先看看簡單工廠的定義吧!學習
定義:提供一個建立對象實例的功能,而無需關心其具體的實現。spa
2.上述問題的解決方案:設計
既然咱們在客戶端中沒法直接獲得實現類的對象,那咱們能夠新增一個類,讓這個類來幫咱們返回實現類的對象,這樣,客戶端只要和新增的類有關係就好了,就不須要知道具體的類了,這樣不就解除了它們之間的耦合了。code
3.簡單工廠結構圖:htm
IAnimal:定義客戶端所須要的功能接口。
Dog:具體實現IAnimal的實現類
Pig:具體實現IAnimal的實現類
Factory:工廠,選擇什麼時候的實現類來建立IAnimal接口對象。
Client:客戶端,經過Factory來獲取IAnimal接口對象。
提示:看完第一章的朋友,看類圖就能知道代碼的大體實現了。
4.簡單工廠示例代碼:
class Program { static void Main(string[] args) { Factory factory = new Factory(); IAnimal animal = factory.Create("pig"); animal.Call(); Console.ReadKey(); } } public class Factory { public IAnimal Create(string Name) { if (Name == "pig") { return new Pig(); } else if (Name == "dog") { return new Dog(); } else { return new Pig(); } } } public interface IAnimal { void Call(); } public class Dog : IAnimal { public void Call() { Console.WriteLine("狗在叫........"); } } public class Pig : IAnimal { public void Call() { Console.WriteLine("豬在叫........"); } }
3、理解簡單工廠
1.靜態工廠
在客戶端中咱們建立了工廠類的實例,使用該實例的Create方法,來返回所須要的接口對象。咱們其實能夠將工廠類看成工具類進行使用,就是將Create方法定義成靜態方法,直接經過Factory.Create()獲取對象實例,最好也將該類的構造函數設爲私有,這樣外部就沒法實例化該工廠類。靜態工廠就是這麼來的。
2.如何選擇合適的接口對象
工廠類是如何返回合適的接口對象的呢?通常經常使用的有兩種方式,第一種就是從客戶端獲取參數,經過對參數的判斷來選擇接口實例,上述的代碼示例就是採用此方法,第二種是經過獲取配置文件中的值,來選擇接口實例。
3.工廠模式的優勢
簡單工廠模式幫助咱們實現了組件的封裝,可讓外部實現面向接口編程。
簡單工廠模式實現了客戶端與具體實現類的解耦。客戶端只需知道工廠和接口就能夠了。
4.工廠模式的缺點
增長的客戶端的複雜度,若是客戶端是經過參數獲取接口對象的,那麼客戶端就要理解參數所表明的具體功能。
系統擴展困難,一旦添加新產品就不得不修改工廠邏輯,有可能形成工廠邏輯過於複雜。
5.什麼時候選用工廠模式
若是想要徹底封裝隔離具體的實現,讓外部只能經過接口來操做封裝體,能夠選用簡單工廠。
若是想要把對外建立對象的職責進行集中管理和控制,可使用簡單工廠。
6.總結
簡單工廠的本質就是選擇實現,再重點就是「選擇」,通常在咱們系統中接口和具體的實現類都是已經存在了的,咱們要思考的就是「如何選擇」實現。