/// <summary>
/// 饅頭
/// </summary>
public class SteamedBread
{
/// <summary>
/// 構造方法
/// </summary>
public SteamedBread()
{ }
/// <summary>
/// 銷售價格
/// </summary>
private double price=0.5;
public double Price
{
get { return price; }
set { price = value; }
}
}
產品對象建立好了,接下來是工廠對象:
/// <summary>
/// 工廠角色
/// </summary>
public class Factory
{
/// <summary>
/// 創建一個饅頭(SteamedBread)對象
/// </summary>
/// <returns></returns>
public static SteamedBread CreateInstance()
{
return new SteamedBread();
}
}
如上就完成了一個簡單工廠模式的簡單實現,一個產品和一個工廠,工廠負責創建這個產品。
/// <summary>
/// 食品接口----扮演抽象產品角色
/// </summary>
public interface IFood
{
/// <summary>
/// 每種食品都有銷售價格,這裏應該作爲共性提升到父類或是接口來
/// 由於我們只需要得到價格,所以這裏就只提供get屬性訪問器
/// </summary>
double price{get;}
}
//------------------------------------------------------------------------------------
/// <summary>
/// 饅頭
/// </summary>
public class SteamedBread:IFood
{
/// <summary>
/// 構造方法
/// </summary>
public SteamedBread()
{ }
public double price
{
get
{
return 0.5;
}
}
}
//------------------------------------------------------------------------------------
/// <summary>
/// 包子
/// </summary>
public class SteamedStuffed:IFood
{
public SteamedStuffed()
{ }
/// <summary>
/// 銷售價格
/// </summary>
public double price
{
get
{
return 0.6; //0.6元一個
}
}
}
//------------------------------------------------------------------------------------
/// <summary>
/// 工廠角色
/// </summary>
public class Factory
{
/// <summary>
/// 創建一個饅頭(SteamedBread)對象
/// </summary>
/// <returns></returns>
public static IFood CreateInstance(string key)
{
if (key == "饅頭")
{
return new SteamedBread();
}
else
{
return new SteamedStuffed();
}
}
}
//------------------------------------------------------------------------------------
public class Client
{
public static void Main(string[] args)
{
//通過工廠創建一個產品的實例
IFood food = Factory.CreateInstance("饅頭");
Console.WriteLine("饅頭{0}元一個!", food.price);
food = Factory.CreateInstance("包子");
Console.WriteLine("包子{0}元一個!", food.price);
}
}
此時的設計就已經完全符合簡單工廠模式的意圖了。顧客(Client)對早餐店營業員(Factory)說,我要“饅頭”,於是營業員便根據顧客所提供的數據(饅頭),去衆多食品中找,找到了然後就拿給顧客。
有些情況下Simple Factory可以由抽象產品角色扮演,一個抽象產品類同時是子類的工廠。也就是說,抽象產品角色扮演兩種角色和職責,出了基本的定義還還兼任工廠角色的職責,負責產品的創建工作。這裏我們在上面的例子基礎上適當修改一下OK了,新建立一個抽象類(Evolution):
/// <summary>
/// 兼任抽象產品角色和工廠角色兩種角色
/// </summary>
public abstract class Evolution
{
/// <summary>
/// 共性字段
/// </summary>
private double price;
public double Price
{
get { return price; }
set { price = value; }
}
public static Evolution CreateInstance(string key)
{
if (key == "饅頭")
{
return new SteamedBread();
}
else
{
return new SteamedStuffed();
}
}
}
public class SteamedBread : Evolution
{
public SteamedBread()
{
this.Price = 0.5; //在構造方法裏初始話屬性的值
}
}
public class SteamedStuffed : Evolution
{
public SteamedStuffed()
{
this.Price = 0.6;
}
}
通過上面的演化,此時客戶端的調用如下:
public class Client
{
public static void Main(string[] args)
{
Evolution el = Evolution.CreateInstance("包子");
Console.WriteLine("包子{0}元一個!", el.Price);
}
}