[設計模式]簡單工廠模式

簡單工廠模式屬於創建型模式,再創建對象時隱藏後方邏輯而不是new去實體化。


 

何時使用

    在不同條件下明確的創建不同實例

邏輯概念

1. 讓其子類實現工廠接口,返回的也是一個抽象的產品。

2. 創建過程在其子類執行


實例:

我重複利用 http://www.runoob.com/design-pattern/factory-pattern.html  所提供的案例,並將其轉換成C#

從下圖可以知道當我們要畫出圓圈 正方形 矩形時,我們先創建了一個叫做Shape的介面,實現Shape接口的實體類(Circle , square rectangle)

並且透過ShapeFactory 工廠進行創建shape,而shape 則傳遞所需要創建的內容,以便獲得創建類別。

代碼

 IShape.cs 

namespace LearnPattern
{
    interface IShape
    {
        void draw();
    }
}

circle.cs

 class circle : IShape
 {
    public void draw()
    {
            Console.WriteLine("drawCircle");
    }
 }

rectangle.cs

  class rectangle : IShape
  {
    public void draw()
    {
            Console.WriteLine("drawRectangle");
    }
  }

square.cs

 class square : IShape
 {
   public void draw()
   {
            Console.WriteLine("drawSquare");
   }
 }

shapeFactory.cs

   class shapeFactory
   {
        public IShape getShape(string shapeType)
        {
            if(shapeType == null)
            {
                return null;
            }
            if(shapeType == "circle")
            {
                return new circle();
            }else if(shapeType == "rect")
            {
                return new rectangle();
            }else if(shapeType == "square")
            {
                return new square();
            }
            return null;
        }
   }

factoryMain.cs

class factoryMain
{
        static void Main(string[] args)
        {
            shapeFactory s = new shapeFactory();
            IShape shape1 = s.getShape("circle");
            shape1.draw();

            IShape shape2 = s.getShape("rect");
            shape2.draw();

            IShape shape3 = s.getShape("square");
            shape3.draw();

            Console.ReadLine();
            
        }
 }

output


實例2

假設現在有一個訊息服務,我們先建立Msg介面並且時做兩個類(weChat 跟 Line) ,

並且在建立MsgServiceFactory 工廠去傳遞我們所需要的訊息

如同上方的做法


參考資料:

1.http://www.runoob.com/design-pattern/factory-pattern.html