GoF設計模式學習-抽象工廠模式

1.目的

提供一個創建一系列相關或者相互依賴的對象的接口,而無需指定他們具體的類,產品簇的實現、流水線模式的實現(同一流水線上的零件是相互依賴的、跨流水線部件無法保證零件直接的連接)。可以從抽象工廠繼承出實際的工廠、實際的流水線。在這些工廠或者流水線上的部件是同一個產品的不同部分,能充分保證零件間的可連接性。

 2.整體實現

1.基於抽象類的抽象工廠的實現

//這裏我們假設如下:鋪了地毯的家庭,房門是木質的;鋪了瓷磚的辦公區域,房門是不鏽鋼的
    //這樣就實現了,同樣是一間房子,那麼所需要的組件是有依賴的,相互制約
   public abstract class AbstractHomeFactory
    {
       //對於抽象工廠是使用抽象類、還是使用接口,網上很多例子都有,按照實際情況來選擇
        //接口是一組行爲規範;抽象類是一個不完全的類,着重族的概念。
       public abstract Door CreateDoor();
        public abstract Floor CreateFloor();
       //使用了抽象類來實現,可以添加一些公用函數的並在抽象類中實現,如果是接口的話
       //需要在相應的實現類中自己實現
        public void Describe()
        {
            Console.WriteLine(this.CreateDoor().Matrial);
            Console.WriteLine(this.CreateFloor().Matrial);
        }
       //注意【1】抽象類的抽象方法必須是public的,否則實現類無法override
    }

    public class Door
    {
        public Door(string _matrial, double _heigh)
        {
            Matrial = _matrial;
            Heigh = _heigh;
        }
        public string Matrial { get; set; }
        public double Heigh { get; set; }
    }

    public class Floor
    {
        public Floor(string _matrial)
        {
            Matrial = _matrial;
        }
        public string Matrial { get; set; }
    }
    //抽象類是一類事物的高度聚合,那麼對於繼承抽象類的子類來說,對於抽象類來說,屬於“是”的關係
   // 而接口是定義行爲規範,因此對於實現接口的子類來說,相對於接口來說,是“行爲需要按照接口來完成”
    //一個類可以直接繼承多個接口,但只能直接繼承一個類(包括抽象類)
    class SweetHomeFactory : AbstractHomeFactory
    {
        //實現類實現抽象類的方法,使用關鍵字override
        public override Door CreateDoor()
        {
            return new Door("地毯",15);
        }

        public override Floor CreateFloor()
        {
            return new Floor("優質木材");
        }
    }
    //在抽象類中,新增一個方法的話,繼承類中可以不用作任何處理;而對於接口來說,則需要修改繼承類,提供新定義的方法。
    //抽象類在定義類型方法的時候,可以給出方法的實現部分,也可以不給出;而對於接口來說,其中所定義的方法都不能給出實現部分
    //繼承類對於兩者所涉及方法的實現是不同的。繼承類對於抽象類所定義的抽象方法,可以不用重寫,也就是說,可以延用抽象類的方法;而對於接口類所定義的方法或者屬性來說,在繼承類中必須要給出相應的方法和屬性實現。
    class OfficeHomeFactory : AbstractHomeFactory
    {
        public override Door CreateDoor()
        {
            return new Door("不鏽鋼", 10);
        }

        public override Floor CreateFloor()
        {
            return new Floor("瓷磚");
        }
    }

static void Main(string[] args)
        {
            //實例化一個 實現了的抽象類的子類
            AbstractHomeFactory facotry = new SweetHomeFactory();
            facotry.Describe();
            Console.ReadLine();
        }


2.基於接口的抽象工廠的實現

3.思考

1.抽象工廠應該通過反射(配置)來確定實現類-實例化一個抽象工廠對象的子類

2.抽象工廠裏面有很多的Model(實體),如何處理部分實體是公用的,二不是隻用於一條產品線,並且做到合理配置呢

3.新增產品線該怎麼處理?

 

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