32種設計模式-抽象工廠模式(AbstractFactory)

介紹:

提供了一個接口,無需指定它們具體的類,就可以創建一組密不可分的對象

主要解決:

 主要解決接口選擇的問題

何時使用:

  系統的產品有多於一個的產品族,而系統只消費其中某一族產品。

如何解決:

 在一個產品族裏面,定義多個產品。

優點:

 1、當一個產品族中的多個對象被設計成一起工作時,它能保證客戶端始終只使用同一個產品族中的對象。

缺點:

 1、產品族擴展非常困難,要增加一個系列的某一產品,既要在抽象的Creator里加代碼,又要在具體的裏面加代碼

使用場景:

  1、qq換皮膚,一整套一起換。

如何實現:

步驟一:創建接口類IColor、IShape

public interface IColor
    {
        void fill();
    }
 public interface IShape
    {
        void draw();
    }

步驟二:創建實體類Rectangle、Square、Circle、Red、Green、Blue

 public class Rectangle : IShape
    {
        public void draw()
        {
            Console.WriteLine("這是Rectangle中的draw方法");
        }
    }
public class Square : IShape
    {
        public void draw()
        {
            Console.WriteLine("這是Square中的draw方法");
        }
    }
 public class Circle : IShape
    {
        public void draw()
        {
            Console.WriteLine("這是Circle中的draw方法");
        }
    }
public class Red : IColor
    {
        public void fill()
        {
            Console.WriteLine("這是Red中的fill方法");
        }
    }
public class Green : IColor
    {
        public void fill()
        {
            Console.WriteLine("這是Green中的fill方法");
        }
    }
public class Blue : IColor
    {
        public void fill()
        {
            Console.WriteLine("這是Blue中的fill方法");
        }
    }

步驟三:創建IAbstractFactory,爲IColor和IShape對象創建接口來獲取工廠

 public interface IAbstractFactory
    {
        IColor GetColor(string color);

        IShape GetShape(string shape);
    }

步驟四:創建AbstractFactory,基於給定的信息生成實體類的對象。

public class AbstractFactory : IAbstractFactory
    {
        public IColor GetColor(string colorType)
        {
            if (colorType.Equals("Red")) {
                return new Red();
            } else if (colorType.Equals("Green")) {
                return new Green();
            } else if (colorType.Equals("Blue")) {
                return new Blue();
            }
            return null;
        }

        public IShape GetShape(string shapeType)
        {
            if (shapeType.Equals("Circle")) {
                return new Circle();
            } else if (shapeType.Equals("Rectangle")) {
                return new Rectangle();
            } else if (shapeType.Equals("Square")) {
                return new Square();
            }
            return null;
        }
    }

步驟五:創建一個工廠創造器/生成器類FactoryProducer

public class FactoryProducer
    {
        public static IAbstractFactory GetFactory() {

            return new AbstractFactory();
        }
    }

步驟六:使用 FactoryProducer 來獲取 AbstractFactory,通過傳遞類型信息來獲取實體類的對象。

static void Main(string[] args)
        {
            #region 單例模式
            {
                //單例模式 Singleton
                Console.WriteLine("========================單例模式========================");
                //餓漢式,不用加鎖,執行效率高,但很容易產生垃圾對象
                SingleObjectA singletonA = SingleObjectA.getInstance();
                singletonA.showMessage();
                //懶漢式,線程不安全
                SingleObjectB singleObjectB = SingleObjectB.getInstance();
                singleObjectB.showMessage();
                //懶漢式,線程安全 雙重加鎖
                SingleObjectC singleObjectC = SingleObjectC.GetSingleObjectC();
                singleObjectC.showMessage();
            }
            #endregion


            #region 抽象工廠模式
            {
                //抽象工廠模式
                Console.WriteLine("========================抽象工廠模式========================");

                IAbstractFactory abstractFactory = FactoryProducer.GetFactory();
                //獲取Circle的對象
                IShape shape1 = abstractFactory.GetShape("Circle");
                //調用方法
                shape1.draw();
                //獲取Rectangle對象
                IShape shape2 = abstractFactory.GetShape("Rectangle");
                //調用方法
                shape2.draw();
                //獲取Square對象
                IShape shape3 = abstractFactory.GetShape("Square");
                //調用方法
                shape3.draw();

                //獲取Red對象
                IColor shape4 = abstractFactory.GetColor("Red");
                //調用對象
                shape4.fill();
                //獲取Green對象
                IColor shape5 = abstractFactory.GetColor("Green");
                //調用對象
                shape5.fill();
                //獲取Blue對象
                IColor shape6 = abstractFactory.GetColor("Blue");
                //調用對象
                shape6.fill();
            }
            #endregion

            Console.ReadLine();
        }

運行結果爲:

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