簡單工廠模式屬於創建型模式,再創建對象時隱藏後方邏輯而不是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 工廠去傳遞我們所需要的訊息
如同上方的做法
參考資料: