通俗易懂設計模式解析——工廠模式(Factory Method)

前言

  上一篇咱們介紹了單例模式,今天給你們講一個比較簡單的模式——工廠模式(Factory Method,工廠模式又是什麼呢?顧名思義,工廠——生產製造東西的地方。那麼應用在程序當中該如何使用、而且又起到什麼效果呢?以致於爲何用工廠模式呢?html

  以前咱們說的OCP原則(開放封閉原則),對擴展開放,對修改封閉這一原則。在工廠模式中有極好的體現,對對象及類進行極好的封裝。使其減小代碼之間的耦合性。更具備擴展性。編程

工廠模式介紹

1、來由

  在咱們編程過程中,總會面臨一些類的建立以及對象的建立,可是因爲需求而不斷變更(增長或者修改),致使對象的變化。這時怎麼處理這個問題呢?設計模式

工廠模式提供的一種封裝機制,隔離出了那些易變更的對象。這個時候需求的變更再也不影響以前的對象的變更了。ide

2、意圖

  定義一個用於建立對象的接口,讓子類決定實例化哪個類。FactoryMethod使一個類的實例化延遲到其子類。學習

3、案例圖

 

 

工廠模式中由如下部分組成:spa

(1)、抽象工廠(Creator): 複製定義工廠所需的基本規則,其餘任何具體工廠都得繼承此抽象工廠設計

(2)、具體工廠(Concrete_Creator):繼承抽象工廠,實現其定義的方法,以此來建立具體的產品3d

(3)、抽象產品(Product):複製定義產品的基本方法及規則,全部具體產品都得基礎此抽象產品類code

(4)、具體產品(Concrete_Product):繼承抽象產品,實現其定義抽象方法,由具體工廠建立,二者是一一對應的關係。htm

4、工廠模式代碼實現

這裏咱們經過一個事例來介紹工廠模式的規則及用法。在工廠模式中,定義抽象工廠,而後其具體工廠繼承實現其抽象方法調用繼承了抽象產品類的具體產品來建立產品。

 

 

 

下面咱們就手機產品的製造來看看下面的事例吧:

namespace ConsoleApp4
{
   public  class Factory_Method_Pattern
    {
    }
    #region  產品 =========================
    /// <summary>
    /// 抽象手機產品類
    /// </summary>
    public abstract class Phone
    {
        public abstract string Create();
    }

    /// <summary>
    /// 具體華爲手機產品類
    /// </summary>
    public class Huawei : Phone
    {
        /// <summary>
        /// 實現抽象方法
        /// </summary>
        /// <returns></returns>
        public override string Create()
        {
            return "華爲一號現世";
        }
    }

    /// <summary>
    /// 具體小米手機產品類
    /// </summary>
    public class Xiaomi : Phone
    {
        /// <summary>
        /// 實現抽象方法
        /// </summary>
        /// <returns></returns>
        public override string Create()
        {
            return "小米一號現世";
        }
    }

    #endregion

    #region  工廠=========================
    /// <summary>
    /// 抽象工廠類
    /// </summary>
    public abstract class Factory
    {
        /// <summary>
        /// 抽象工廠類的方法,建立調用產品
        /// </summary>
        /// <returns></returns>
        public abstract Phone CreatePhone();
    }

    /// <summary>
    /// 具體華爲工廠類,繼承抽象工廠類
    /// </summary>
    public class HuaweiFactory : Factory
    {
        /// <summary>
        /// 實現繼承方法
        /// </summary>
        /// <returns></returns>
        public override Phone CreatePhone()
        {
            return new Huawei();
        }
    }

    /// <summary>
    /// 具體小米工廠類,繼承抽象工廠類
    /// </summary>
    public class XiaomiFactory : Factory
    {
        /// <summary>
        /// 實現繼承方法
        /// </summary>
        /// <returns></returns>
        public override Phone CreatePhone()
        {
            return new Xiaomi();
        }
    }
    #endregion 
}

 

 class Program
    {
        static void Main(string[] args)
        {
            //初始化工廠
            Factory huaweiFactory = new HuaweiFactory();
            
            //生產具體的華爲手機
            var result=huaweiFactory.CreatePhone();
            //華爲手機現世
            var answer = result.Create();
            Console.WriteLine(answer);

            Factory xiaomiFactory = new XiaomiFactory();
            result = xiaomiFactory.CreatePhone();
            answer = result.Create();
            Console.WriteLine(answer); 

            Console.ReadLine();
        }
    }

 

  在上述事例中,一樣是先把手機抽象出一個抽象類,手機固然也不是憑空出現的。因此須要再抽象一個工廠類。工廠類派生子類不一樣的手機廠商類。一樣手機也派生了不同的品牌。手機廠商類再對應手機品牌去生產相應的手機。這時咱們須要增長一個手機手機品牌,咱們不須要去修改工廠類及產品類。咱們另外新增便可。徹底不影響其原來的運行。好比咱們須要新增魅族手機。

    #region 新增魅族手機 ================
    /// <summary>
    /// 新增魅族工廠類
    /// </summary>
    public class MeizuFactory : Factory
    {
        public override Phone CreatePhone()
        {
            return new Meizu();
        }
    }

    /// <summary>
    /// 新增具體魅族手機產品類
    /// </summary>
    public class Meizu : Phone
    {
        public override string Create()
        {
            return "魅族一號現世";
        }
    }
    #endregion

 

在客戶端調用時增長如下調用就能夠了

            Factory meizuFactory = new MeizuFactory();
            result = meizuFactory.CreatePhone();
            answer = result.Create();
            Console.WriteLine(answer);

使用場景及優缺點

在此模式中,將全部要建立的具體對象的工做都延遲放在了子類中去實現,實現了一種擴展的策略。與OCP原則相對應。

工廠模式主要針對解決的是」單個對象」的問題。隔離類的對象的使用者與具體類型之間的耦合關係。去實現了必定程度的解耦。

(一)使用場景

一、當用戶不須要知道產品的類名的時候或者不關心如何建立的時候。咱們只須要知道建立它的具體工廠的時候。

二、將建立對象的任務委託給多個工廠中的一個,客戶端使用的時候無需關心是哪個建立產品。當須要動態指定。

(二)優勢

一、在編程方法中,客戶端調用不須要知道產品的具體工廠,也不須要關心如何建立的。

二、在增長需求的時候,增長產品的時候僅須要新增一個工廠類及產品類便可,不須要對原來的代碼進行修改。可輕易的擴展。

(三)缺點

在增長產品的時候,額外的增長了工廠類及產品類。增長一個產品增長兩個類。在必定程度上增長了系統的複雜度。同時也加強了類之間的依賴性。這也就是其中很差的問題

總結

  每個設計模式都有對應的使用場合,切勿濫用。在咱們學習設計模式的同時,咱們也須要以其原主要則做爲基準學習。萬萬不能違背原則。在設計模式——工廠模式中,將建立對象的任務委託給其工廠子類、延遲執行。解決了系統難於擴展的問題,同時也減小了具體類與對象之間的耦合性。也實現了開放擴展封閉修改的原則。

  這個社會是存在不公平的,不要抱怨,由於沒有用!人老是在檢討中進步的!

  C#設計模式系列目錄

 

歡迎你們掃描下方二維碼,和我一塊兒踏上設計模式的闖關之路吧!

  

相關文章
相關標籤/搜索