從0自學C#09--抽象工廠模式實例

抽象工廠模式(Abstract Factory)

1.適用環境

(主要是用在生產製造多種產品,軟件有多種皮膚,多種數據庫等環境)

  • 一個系統不應當依賴於產品類實例如何被創建、組合和表達的細節,這對於所有類型的工廠模式都是重要的。
  • 系統中有多於一個的產品族,而每次只使用其中某一產品族。
  • 屬於同一個產品族的產品將在一起使用,這一約束必須在系統的設計中體現出來。
  • 系統提供一個產品類的庫,所有的產品以同樣的接口出現,從而使客戶端不依賴於具體實現

2.模式定義

抽象工廠模式(Abstract Factory Pattern):提供一個創建一系列相關或相互依賴對象的接口,而無須指定它們具體的類。抽象工廠模式又稱爲Kit模式,屬於對象創建型模式。

3.模式結構

抽象工廠模式包含如下角色:

  • AbstractFactory:抽象工廠
  • ConcreteFactory:具體工廠
  • AbstractProduct:抽象產品
  • Product:具體產品

爲了更清晰地理解工廠方法模式,需要先引入兩個概念:

  • 產品等級結構:產品等級結構即產品的繼承結構,如一個抽象類是電視機,其子類有海爾電視機、海信電視機、TCL電視機,則抽象電視機與具體品牌的電視機之間構成了一個產品等級結構,抽象電視機是父類,而具體品牌的電視機是其子類。
  • 產品族 :在抽象工廠模式中,產品族是指由同一個工廠生產的,位於不同產品等級結構中的一組產品,如海爾電器工廠生產的海爾電視機、海爾電冰箱,海爾電視機位於電視機產品等級結構中,海爾電冰箱位於電冰箱產品等級結構中。

類圖

4.代碼

流程接口

interface IFlow
    {
        IRxAlign CreateRxAlign();

        IDispensing CreateDispensing();
    }

class FlowA : IFlow
    {
        public IRxAlign CreateRxAlign()
        {
            return new RxAlignA();
        }

        public IDispensing CreateDispensing()
        {
            return new DispensingA();
        }
    }


class FlowB : IFlow
    {
        public IRxAlign CreateRxAlign()
        {
            return new RxAlignB();
        }

        public IDispensing CreateDispensing()
        {
            return new DispensingB();
        }
    }

耦合接口

interface IRxAlign
    { 
        event LocationChange LocChange;

        int[] RoPulse { set; get; }

        int[] FiPulse { set; get; }

        int[] RoMaxStep { set; get; }

        double[] RoRESTarget { set; get; }

        double[] TxP { set; get; }

        double[] RESmin { set; get; }

        double[] RESmax { set; get; }

        Coordinate Location { set; get; }

        void LoadPara(string PN);

        void GoHome();

        void Start();

        void Stop();
    }

class RxAlignA : IRxAlign
    {
        private ControlCard card;

        private QSFP28 product;

        private double RESmax, RESmin, RES;

        private double[] TxPower;

        public RxAlignA()
        {
            this.RESmax = 1.0;
            this.RESmin = 0.4;
        }

        public bool ConfigPara()
        {
            try
            {
                this.card = new ControlCard();
                this.product = new QSFP28();
                return true;
            }
            catch
            {
                return false;
            }
        }

        public void GoHome()
        {
            //QSFP28 go home
        }

        public void Start()
        {
            //QSFP28 start
        }

        public void Stop()
        {
            card = null;
            product = null;
        }
        ...
    }

class RxAlignB : IRxAlign
    {
        private ControlCard card;

        private CFP4 product;

        private double RESmax, RESmin, RES;

        private double[] TxPower;

        public RxAlignB()
        {
            this.RESmax = 1.0;
            this.RESmin = 0.4;
        }

        public bool ConfigPara()
        {
            try
            {
                this.card = new ControlCard();
                this.product = new CFP4();
                return true;
            }
            catch
            {
                return false;
            }
        }

        public void GoHome()
        {
            //CFP4 go home
        }

        public void Start()
        {
            //CFP4 start
        }

        public void Stop()
        {
            card = null;
            product = null;
        }
        ...
    }

點膠接口

interface IDispensing
    {
        //code
    }

class DispensingA : IDispensing
    {
        //code
    }

class DispensingB : IDispensing
    {
        //code
    }

主線程調用

flow = new FlowA();
align = flow.CreateRxAlign();
align.LoadPara(this.comboBoxPN.Text);

dispens = flow.CreateDispensing();
dispens.//code
...

[轉自]
http://design-patterns.readthedocs.org/zh_CN/latest/creational_patterns/abstract_factory.html

[參考]
http://www.cnblogs.com/ytaozhao/p/3392149.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章