戀愛中的設計模式 之
簡單工廠模式
----Simple Factory Pattern
Simple Factory模式的核心特點:
爲創建對象提供接口,將創建對象的具體過程屏蔽起來。
戀愛中的Simple Factory模式:
――追MM麼,少不了請MM吃飯,高檔飯館去不起,KFC,McDonald之類的快餐店自然是上上之選
MM:“今天我要去KFC吃飯。”
――到達KFC
MM:“我要4個雞翅”
GG:“好的。服務員,給我來4個雞翅”
--不幾日,MM又光臨Mcdonald,類似事件再次上演。
“案情”分析:
無論去KFC還是Mcdonald,MM只要跟你說“來4個雞翅”就行了,不用說“來4個KFC的雞翅”或“來4個Mcdonald的雞翅”,身爲GG的你自然會根據所處的地點購買到相應的雞翅。
由此不難看出,Simple Factory模式將客戶類(MM)和產品類(雞翅)分隔開來,當客戶類需要某種產品時,只須跟工廠類(苦力GG)請求即可。
Simple Factory模式的組成:
1) 工廠類角色:這是本模式的核心,含有一定的商業邏輯和判斷邏輯。它往往由一個具體類實現。 例子中的GG就屬於工廠類角色
2) 抽象產品角色:它是實際產品的抽象,提供統一的接口和方法以供實際產品去各自實現。它往往由接口或者抽象類來實現。 例子中並沒有直接出現,不過對KFC和Mcdonald抽象,可以得到“快餐店”這個接口,它就是抽象產品類
3) 具體產品角色:工廠類所創建的對象就是此角色的實例。它往往由一個具體類實現。 例子中的KFC和Mcdonald就是該角色
Simple Factory模式的優缺點:
優點:從直接創建變成“消費”,讓客戶更“傻瓜”。
滿足DIP(依賴倒轉原則,Dependence Inversion Principle,要針對接口編程,不要針對實現編程,即高層類對底層類開放接口,而不是開放實現)。
滿足LOD(迪米特法則,Law of Demeter,只與你直接的朋友通信,而避免和陌生人通信,MM只跟GG通信,而不去跟快餐店店員通信)
消費者無須任何變動就可消費新產品。如:如果你們到了振鼎雞,那麼MM也只要說“4個雞翅”即可,MM不用作任何變動
缺點:不滿組OCP(開放-關閉原則,Open-Closed Principle,對擴展開放,對修改關閉)。
當產品發生變動時,工廠類(GG)也要做相應的修改。如:如果增加一個新的產品(比如振鼎雞),工廠類就要作相應的修改;如果MM準備嘗試新產品(比如漢堡),工廠類也需要作相應的修改。
Simple Factory模式的使用:
顧名思義,Simple Factory模式是一種很簡單的模式,它其實是Factory Method模式的一種特殊情況。當用戶需要使用某個對象(吃雞翅),但好幾個類都可以生成這種對象(KFC,Mcdonald都賣雞翅),用戶不想去考慮該實例化哪個類的時候,就可以考慮使用這種方法。
使用了Simple Factory的一個明顯的好處就是:用戶不需要去實例化對象,只要“消費”對象就可以了。
如何去實現Simple Factory模式呢?可以分以下幾個步驟:
1) 分清角色:客戶,產品,工廠(MM是客戶,GG是工廠,KFC和Mcdonald是產品);
2) 對產品抽象,創建抽象產品接口(“快餐店”);
3) 實現具體產品(“KFC”類和“Mcdonald”類);
4) 實現工廠類,該類是整個環節的核心,通過工廠類,可以獲得具體產品類的實例,這個函數應該被聲明爲靜態函數
5) 其他操作:客戶類,客戶消費動作等等。
例示代碼:
編程環境:Visual Studio 2005
運行方法:通過VS05新建C#的Console Application,將下面的代碼全部拷貝,覆蓋Program.cs中的代碼,然後即可運行。
/*
* 1、SIMPLE FACTORY:追MM少不了請吃飯了,麥當勞的雞翅和肯德基的雞翅都是MM愛吃的東西,
* 雖然口味有所不同,但不管去麥當勞或肯德基,MM只要跟你說“我要個雞翅”就可以了,
* 如果在KFC,你肯定不會買來MCDONALD的雞翅,反之亦然。
*/
using System;
using System.Collections.Generic;
using System.Text;
namespace Simple_Factory
{
/// <summary>
/// 產品接口
/// </summary>
interface IFastFood
{
void SellChickenWing();
}
/// <summary>
/// 實際產品
/// </summary>
class KFC : IFastFood
{
public void SellChickenWing()
{
Console.WriteLine("歡迎光臨KFC!這是您點的個雞翅.請慢慢享用");
}
};
/// <summary>
/// 實際產品
/// </summary>
class Mcdonald : IFastFood
{
public void SellChickenWing()
{
Console.WriteLine("歡迎光臨Mcdonald!這是您點的個雞翅.請慢慢享用");
}
};
/// <summary>
/// 工廠類,苦力...
/// </summary>
class SSGG
{
public static IFastFood GoTo(string placeName)
{
switch(placeName)
{
case "KFC" :
{
return new KFC();
}
case "Mcdonald" :
{
return new Mcdonald();
}
default :
return null;
}
}
};
/// <summary>
/// 客戶類
/// </summary>
class PPMM
{
static void Main(string[] args)
{
//某天,二人來到KFC吃飯,MM點了個雞翅
IFastFood targetPlace = SSGG.GoTo("KFC");
targetPlace.SellChickenWing();
//隔天,二人來到Mcdonald吃飯,MM又點了個雞翅
IFastFood targetPlace2 = SSGG.GoTo("Mcdonald");
targetPlace2.SellChickenWing();
}
}
}