設計模式之簡單工廠(二)

學習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.總結

簡單工廠的本質就是選擇實現,再重點就是「選擇」,通常在咱們系統中接口和具體的實現類都是已經存在了的,咱們要思考的就是「如何選擇」實現。

相關文章
相關標籤/搜索