工廠方法模是定義一個勇於創建對象的介面,讓子類決定實例化哪一個類。 抽象工廠模式(Abstract Factory),提供一個創建一系列相關或相互依賴對象的介面,而無需指定它們具體的類 抽象工廠模式構成 抽象工廠角色(AbstractFactory):聲明生成抽象產品的方法 具體工廠角色(Concr... ...
工廠方法模是定義一個勇於創建對象的介面,讓子類決定實例化哪一個類。
抽象工廠模式(Abstract Factory),提供一個創建一系列相關或相互依賴對象的介面,而無需指定它們具體的類
抽象工廠模式構成
抽象工廠角色(AbstractFactory):聲明生成抽象產品的方法
具體工廠角色(ConcreteFactory):執行生成抽象產品的方法,生成一個具體的產品
抽象產品(AbstactProduct):為一種產品聲明介面
具體產品(ConcreteProduct):定義具體工廠生成的具體產品的對象,實現產品介面
客戶角色(Client):我們的應用程式,使用抽象產品和抽象工廠生成對象
以KFC為例闡述抽象工廠模式的應用,假設現在KFC的食品直接沒有任何關聯,不可以分類,各個Product相互獨立。這樣工廠方法模式就可以很好解決,定義一系列的簡單工廠,用戶沒要求一種食品就
使用一個合適的簡單工廠來生產相應的Product就可以。
但實際情況下,KFC的產品還可以進行套餐出售,假設KFC的產品可以分為食品Food和飲料Drink,Food和Drink分別構成了一個產品族,一個產品族就是一系列相似對象的抽象。KFC出售2種套餐,
一種是經濟型,包括雞翅和可樂;另一種是豪華型,
包括雞腿和咖啡。用戶只需要指出需要的套餐名即可獲得相應的Food和Drink。這種情況下,工廠方法模式將不再適用,而採用抽象工廠模式進行實現。
KFCFood.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 抽象工廠模式_KFC_
{
/// <summary>
/// 產品1,KFC食品
/// </summary>
abstract class KFCFood
{
public abstract void DisPlay();
}
}
Chicken.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 抽象工廠模式_KFC_
{
class Chicken : KFCFood
{
public override void DisPlay()
{
Console.WriteLine("雞腿+1");
}
}
}
Wings.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 抽象工廠模式_KFC_
{
class Wings : KFCFood
{
public override void DisPlay()
{
Console.WriteLine("雞翅+1");
}
}
}
KFCDrink.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 抽象工廠模式_KFC_
{
abstract class KFCDrink
{
public abstract void Display();
}
}
Coke.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 抽象工廠模式_KFC_
{
class Coke : KFCDrink
{
public override void Display()
{
Console.WriteLine("可樂+1");
}
}
}
Coffee.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 抽象工廠模式_KFC_
{
class Coffce : KFCDrink
{
public override void Display()
{
Console.WriteLine("咖啡+1");
}
}
}
IKFCFactory.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 抽象工廠模式_KFC_
{
/// <summary>
/// 抽象工廠,生產套餐
/// </summary>
interface IKFCFactory
{
KFCFood CreateFood();
KFCDrink CreteDrink();
}
}
CheapPackageFactory.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 抽象工廠模式_KFC_
{
/// <summary>
/// 經濟型套餐:雞翅和可樂
/// </summary>
class CheapPackageFactory : IKFCFactory
{
public KFCFood CreateFood()
{
return new Wings();
}
public KFCDrink CreteDrink()
{
return new Coke();
}
}
}
LuxuryPackageFactory.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 抽象工廠模式_KFC_
{
/// <summary>
/// 豪華型套餐:雞腿和咖啡
/// </summary>
class LuxuryPackageFactory : IKFCFactory
{
public KFCFood CreateFood()
{
return new Chicken();
}
public KFCDrink CreteDrink()
{
return new Coffce();
}
}
}
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 抽象工廠模式_KFC_
{
class Program
{
static void Main(string[] args)
{
IKFCFactory factory1 = new CheapPackageFactory();
KFCFood food = factory1.CreateFood();
food.DisPlay();
KFCDrink drink = factory1.CreteDrink();
drink.Display();
Console.Read();
}
}
}
這個在初始化的時候出現一次,如果需求增加來自功能,比如新增一個套餐。
還有客戶端程式不可能只有一個嗎如果一百個客戶端調用訪問的類,就要修改100次 IKFCFactory factory1 = new CheapPackageFactory();
所以我們用簡單工廠可以改進抽象工廠
class Order
{
private static readonly string db = "CheapPackage";
//private static readonly string db = "LuxuryPackage";
public static KFCFood CreateFood()
{
KFCFood result = null;
switch (db)
{
case "CheapPackage":
result = new Wings();
break;
case "LuxuryPackage":
result = new Chicken();
break;
}
return result;
}