簡單工廠模式的缺點,有一點是——簡單工廠模式系統難以擴展,一旦添加新產品就不得不修改簡單工廠方法,這樣就會造成簡單工廠的實現邏輯過於複雜,工廠方法模式之所以可以解決簡單工廠的模式,是因爲它的實現把具體產品的創建推遲到子類中,此時工廠類不再負責所有產品的創建,而只是給出具體工廠必須實現的接口,這樣工廠方法模式就可以允許系統不修改工廠類邏輯的情況下來添加新產品,這樣也就克服了簡單工廠模式中缺點。使用工廠方法實現的系統,如果系統需要添加新產品時,我們可以利用多態性來完成系統的擴展,對於抽象工廠類和具體工廠中的代碼都不需要做任何改動。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Factory
{
/// <summary>
/// 抽象產品基類
/// </summary>
public abstract class Food
{
public abstract void Print();
}
/// <summary>
/// 西紅柿
/// </summary>
public class Tomato : Food
{
public Tomato() {
this.Print();
}
/// <summary>
/// 繼承抽象基類,必須實現的方法
/// </summary>
public override void Print()
{
Console.WriteLine("西紅柿");
}
}
/// <summary>
/// 土豆
/// </summary>
public class Potatoes : Food
{
public Potatoes() {
this.Print();
}
public override void Print()
{
Console.WriteLine("土豆");
}
}
/// <summary>
/// 工廠基類 有一個產生方法,返回一個產品類
/// </summary>
public abstract class Creator {
public abstract Food CreateFoodFactory();
}
/// <summary>
/// 西紅柿工廠
/// </summary>
public class TomatoFactory : Creator
{
/// <summary>
/// 產生西紅柿
/// </summary>
/// <returns></returns>
public override Food CreateFoodFactory()
{
return new Tomato();
}
}
public class PotatoesFactory:Creator{
public override Food CreateFoodFactory()
{
return new Potatoes();
}
}
}
測試實現:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Factory
{
class Program
{
static void Main(string[] args)
{
//創建2個工廠
Creator potatoesFactory = new PotatoesFactory();
Creator tomatoFactory = new TomatoFactory();
//生產對應的產品
Food potatoes = potatoesFactory.CreateFoodFactory();
Food tomatoegg = tomatoFactory.CreateFoodFactory();
Console.Read();
}
}
}
工廠模式中各類之間的UML圖:
從UML圖可以看出,在工廠方法模式中,工廠類與具體產品類具有平行的等級結構,它們之間是一一對應的。針對UML圖的解釋如下:
Creator類:充當抽象工廠角色,任何具體工廠都必須繼承該抽象類
TomatoScrambledEggsFactory和ShreddedPorkWithPotatoesFactory類:充當具體工廠角色,用來創建具體產品
Food類:充當抽象產品角色,具體產品的抽象類。任何具體產品都應該繼承該類
TomatoScrambledEggs和ShreddedPorkWithPotatoes類:充當具體產品角色,實現抽象產品類對定義的抽象方法,由具體工廠類創建,它們之間有一一對應的關係。