我們在編程的時候,每當"new"一個對象之後,這個對象就依賴於這個類了。如果在後期的維護過程中由於某些原因需要修改一下這個類,則唯一的做法就是打開源代碼,進行修改,修改所有與這個對象有關的操作。這對我們是非常不利的
所以我們專門定義一個類來負責創建其他類的實例,被創建的實例通常都具有共同的父類或接口。簡單工廠模式又稱為靜態工廠方法(Static Factory Method)模式,屬於類的創建型模式。
根據提供的數據或者參數返回幾個可能的類中的一個實例,說通俗點有點像面向對象編程中的多態性,一個基類,有多個派生類,在另外的調用程序中,根據參數來決定返回這個基類的哪個具體的派生類,返回值為基類類型,因為基類的引用可以指向派生類對象,而且這些所有的派生類都包含有基類的函數,也就是說派生類中有相同的函數,但是函數的實現可能不同。
舉現實中的例子說明:
每次參加不同的聚會或者與不同的人見面,可能穿的衣服是不一樣的,比如,你今天上午要與你的一個新客戶見面,你可能會對你的老婆說:老婆,給拿件商務裝(參數),我要去見我的一個客戶,你老婆(工廠類)接到你的請求(商務裝參數)後,從衣櫃中取出一件商務裝(具體產品),交給你。整個過程就完成了。
實例代碼:
/// <summary>
/// 抽象產品類:上衣
/// </summary>
public interface ICoat
{
void GetYourCoat();
}
namespace SimpleFactory
{
/// <summary>
/// 具體產品類:商務上衣
/// </summary>
public class BusinessCoat:ICoat
{
public void GetYourCoat()
{
Console.WriteLine("商務上衣");
}
}
/// <summary>
/// 具體產品類:時尚上衣
/// </summary>
public class FashionCoat : ICoat
{
/// <summary>
/// 實現ICoat中定義的方法
/// </summary>
public void GetYourCoat()
{
Console.WriteLine("時尚上衣");
}
}
}
簡單工廠模式中最核心的部分:工廠類
namespace SimpleFactory
{
/// <summary>
/// 簡單工廠模式中的核心部分:工廠類
/// </summary>
public class Factory
{
public ICoat CreateCoat(string styleName)
{
switch (styleName.Trim().ToLower())
{
case "business":
return new BusinessCoat();
case "fashion":
return new FashionCoat();
default :
throw new Exception("還沒有你要的那種衣服");
}
}
}
}
客戶在調用的時候的代碼
/// <summary>
/// 客戶類
/// </summary>
class Client
{
static void Main(string[] args)
{
ICoat food;
try
{
Factory factory = new Factory();
Console.Writeln("我要的是時尚上衣");
food = factory.CreateCoat("fashion");
food.GetYourCoat();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}