天天看點

工廠模式(Factory)引言簡單工廠工廠方法抽象工廠設計說明34

1、簡單工廠

2、工廠方法

3、抽象工廠

簡單工廠和工廠方法這倆個設計模式不做詳細介紹,請各位看官自行百度,有大量的解釋。再次我簡單引用一下其他部落客對這三種模式的了解。

引言

簡單工廠、工廠方法、抽象工廠都屬于設計模式中的建立型模式。其主要功能都是幫助我們把對象的執行個體化部分抽象取了出來,優化了系統的架構,并且增強了系統的擴充性。此篇部落格是筆者對學完這三種模式之後一個小小的總結

簡單工廠

簡單工廠模式的工廠類一般是使用靜态方法,通過接收的參數不同來傳回不同的對象執行個體。不修改代碼的話,是無法擴充的

優點:用戶端可以免除直接建立産品對象的責任,而僅僅是“消費”産品。簡單工廠模式通過這種做法實作了對責任的分割

缺點:由于工廠類集中了所有執行個體的建立邏輯,違反了高内聚責任配置設定原則,将全部建立邏輯集中到了一個工廠類中;它所能建立的類隻能是事先考慮到的,如果需要添加新的類,則就需要改變工廠類了

工廠方法

工廠方法是針對每一種産品提供一個工廠類。通過不同的工廠執行個體來建立不同的産品執行個體。在同一等級結構中,支援增加任意産品

優點:允許系統在不修改具體工廠角色的情況下引進新産品

缺點:由于每加一個産品,就需要加一個産品工廠的類,增加了額外的開發量

抽象工廠

抽象工廠是應對産品族概念的。應對産品族概念而生,增加新的産品線很容易,但是無法增加新的産品。比如,每個汽車公司可能要同時生産轎車、貨車、客車,那麼每一個工廠都要有建立轎車、貨車和客車的方法

優點:向用戶端提供一個接口,使得用戶端在不必指定産品具體類型的情況下,建立多個産品族中的産品對象

缺點:增加新的産品等級結構很複雜,需要修改抽象工廠和所有的具體工廠類,對“開閉原則”的支援呈現傾斜性

以上是對三種方法的介紹和優缺點描述,接下來我們使用一個執行個體來說明抽象工廠的建立

設計說明

案例如下,手機廠商擁有螢幕和主機闆這倆條生産線,不同的手機廠商生産規格不同的産品(小米公司和蘋果公司)

我們進行分析,倆家手機廠商,倆條生産線生産倆種裝置

1

定義如下,首先我們定義一個抽象的工廠,這個工廠的方法包含

1、建立螢幕

2、建立主機闆

這個抽象工廠的作用主要是讓繼承他的子類 實作這倆個抽象方法

/// <summary>
    /// 抽象工廠類:提供建立不同品牌的手機螢幕和手機主機闆
    /// </summary>
    public abstract class AbstractFactory
    {
        //工廠生産螢幕
        public abstract Screen CreateScreen();
        //工廠生産主機闆
        public abstract MotherBoard CreateMotherBoard();
    }
           

2

定義手機螢幕和手機主機闆的的抽象方法,因為不同的廠商對産品規格不同,是以定義好抽象的基類,再交由各不同的廠商去實作功能,實作如相

/// <summary>
    /// 螢幕抽象類:提供每一品牌的螢幕的繼承
    /// </summary>
    public abstract class Screen
    {
        public abstract void print();
    }

/// <summary>
    /// 主機闆抽象類:提供每一品牌的主機闆的繼承
    /// </summary>
    public abstract class MotherBoard
    {
        public abstract void print();
    }
           

不同廠商對螢幕和主機闆的實作類如下:

/// <summary>
    /// 蘋果手機螢幕
    /// </summary>
    public class AppleScreen:Screen
    {
        public override void print()
        {
            Console.WriteLine("蘋果手機螢幕!");
        }
    }
    /// <summary>
    /// 蘋果手機主機闆
    /// </summary>
    public class AppleMotherBoard:MotherBoard
    {
        public override void print()
        {
            Console.WriteLine("蘋果手機主機闆!");
        }
    }

    /// <summary>
    /// 小米手機螢幕
    /// </summary>
    public class XiaoMiScreen:Screen
    {
        public override void print()
        {
            Console.WriteLine("小米手機螢幕!");
        }
    }

    /// <summary>
    /// 小米手機主機闆類
    /// </summary>
    public class XiaoMiMotherBoard :MotherBoard
    {
        public override void print()
        {
            Console.WriteLine("小米手機主機闆!");
        }
           

3

經過上面倆個步驟我們得到了不同商品的實作,現在我們還缺少一個東西,就是不同的商家對自己商品的擷取實作

此時我們應該建立不同商家的工廠類,有倆個商家,我們就建立倆個工廠類,工廠中分别實作建立自己産品

實作的工廠要繼承AbstractFactory

/// 小米手機工廠類
    /// </summary>
    public class XiaoMiFactory : AbstractFactory
    {
        /// <summary>
        /// 生産小米手機螢幕
        /// </summary>
        /// <returns></returns>
        public override Screen CreateScreen()
        {
            return new XiaoMiScreen();
        }

        /// <summary>
        /// 生産小米手機主機闆
        /// </summary>
        /// <returns></returns>
        public override MotherBoard CreateMotherBoard()
        {
            return new XiaoMiMotherBoard();
        }
    }

           
/// <summary>
    /// 蘋果手機工廠
    /// </summary>
    public class AppleFactory : AbstractFactory
    {
        /// <summary>
        /// 生産蘋果手機螢幕
        /// </summary>
        /// <returns></returns>
        public override Screen CreateScreen()
        {
            return new AppleScreen();
        }

        /// <summary>
        /// 生産蘋果手機主機闆
        /// </summary>
        /// <returns></returns>
        public override MotherBoard CreateMotherBoard()
        {
            return new AppleMotherBoard();
        }
    }
           

4

内容建立完成,接下去我們就來進行結果的輸出

//小米工廠生産小米手機的螢幕和主機闆
            AbstractFactory xiaomiFactory = new XiaoMiFactory();
            Screen xiaomiScreen = xiaomiFactory.CreateScreen();
            xiaomiScreen.print();
            MotherBoard xiaomiMotherBoard = xiaomiFactory.CreateMotherBoard();
            xiaomiMotherBoard.print();

            //蘋果工廠生産蘋果手機螢幕和主機闆
            AbstractFactory appleFactory = new AppleFactory();
            Screen appleScreen = appleFactory.CreateScreen();
            appleScreen.print();
            MotherBoard appleMotherBoard = appleFactory.CreateMotherBoard();
            appleMotherBoard.print(); 
           

了解:

不同的商家擁有自己的工廠建立自己的産品

1、首先執行個體化商家工廠

2、建立不同的商品

3、調用商品功能

繼續閱讀