//以下文字內容摘自網絡;
工廠方法模式是爲了克服簡單工廠模式的缺點而設計出來的,簡單工廠模式的工廠類隨着產品類的增加需要增加額外的代碼),而工廠方法模式每個具體工廠類只完成單個實例的創建,所以它具有很好的可擴展性。但是在現實生活中,一個工廠只創建單個產品這樣的例子很少,因爲現在的工廠都多元化了,一個工廠創建一系列的產品,如果我們要設計這樣的系統時,工廠方法模式顯然在這裏不適用,然後抽象工廠模式卻可以很好地解決一系列產品創建的問題.
抽象工廠模式:提供一個創建產品的接口來負責創建相關或依賴的對象,而不具體明確指定具體類,抽象工廠允許客戶使用抽象的接口來創建一組相關產品,而不需要知道或關心實際生產出的具體產品是什麼。這樣客戶就可以從具體產品中被解耦.
抽象工廠模式將具體產品的創建延遲到具體工廠的子類中,這樣將對象的創建封裝起來,可以減少客戶端與具體產品類之間的依賴,從而使系統耦合度低,這樣更有利於後期的維護和擴展,這真是抽象工廠模式的優點所在,然後抽象模式同時也存在不足的地方.
知道了抽象工廠的優缺點之後,也就能很好地把握什麼情況下考慮使用抽象工廠模式了,下面就具體看看使用抽象工廠模式的系統應該符合那幾個前提:
- 一個系統不要求依賴產品類實例如何被創建、組合和表達的表達,這點也是所有工廠模式應用的前提。
- 這個系統有多個系列產品,而系統中只消費其中某一系列產品
- 系統要求提供一個產品類的庫,所有產品以同樣的接口出現,客戶端不需要依賴具體實現
具體代碼demo實現:
主程序
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using abstractFactory.Factory;
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();
PackageBFactory pbfactory = new PackageBFactory();
Console.WriteLine("ok! you need to pay: $ "+ pbfactory.CreatePackage());
Console.Read();
}
}
}
工廠類
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace abstractFactory.Factory
{
/// <summary>
/// KFC工廠接口
/// 實現兩個方法,一個生產食物,一個是生產飲料
/// </summary>
public abstract class KFCFactory {
protected abstract List<Food> CreateFood();
protected abstract List<Drink> CreateDrink();
}
public interface PackageFactory {
double CreatePackage();
}
/// <summary>
/// 套餐A工廠
/// </summary>
public class PackageAFactory : KFCFactory, PackageFactory {
public double CreatePackage() {
CreateFood();
CreateDrink();
return ShoudPay();
}
private double totalPrice = 0.00;
/// <summary>
/// 創建食物
/// </summary>
/// <returns></returns>
protected override List<Food> CreateFood()
{
List<Food> foods = new List<Food>();
Hamburger hamburger = new Hamburger();
totalPrice+= hamburger.GetPrice();
foods.Add(hamburger);
Chicken chicken = new Chicken();
totalPrice += chicken.GetPrice();
foods.Add(chicken);
return foods;
}
/// <summary>
/// 創建飲料
/// </summary>
/// <returns></returns>
protected override List<Drink> CreateDrink()
{
List<Drink> drinks = new List<Drink>();
CocaCala cocacala = new CocaCala();
totalPrice += cocacala.GetPrice();
drinks.Add(cocacala);
return drinks;
}
private double ShoudPay() {
return totalPrice;
}
}
/// <summary>
/// 套餐B工廠
/// </summary>
public class PackageBFactory : KFCFactory, PackageFactory
{
public double CreatePackage()
{
CreateFood();
CreateDrink();
return ShoudPay();
}
private double totalPrice = 0.00;
/// <summary>
/// 創建食物
/// </summary>
/// <returns></returns>
protected override List<Food> CreateFood()
{
List<Food> foods = new List<Food>();
Hamburger hamburger = new Hamburger();
totalPrice += hamburger.GetPrice();
Chips chips = new Chips();
totalPrice += chips.GetPrice();
foods.Add(hamburger);
foods.Add(chips);
return foods;
}
/// <summary>
/// 創建飲料
/// </summary>
/// <returns></returns>
protected override List<Drink> CreateDrink()
{
List<Drink> drinks = new List<Drink>();
Coffee cofee = new Coffee();
totalPrice += cofee.GetPrice();
drinks.Add(cofee);
return drinks;
}
private double ShoudPay()
{
return totalPrice;
}
}
/// <summary>
/// 食物基類
/// </summary>
public abstract class Food {
public abstract void Print();
protected double price ;
public abstract double GetPrice();
}
/// <summary>
/// 飲品基類
/// </summary>
public abstract class Drink {
public abstract void Print();
protected double price;
public abstract double GetPrice();
}
/// <summary>
/// Hamburger
/// </summary>
public class Hamburger : Food {
public Hamburger() {
this.Print();
this.price = 12.00;
}
/// <summary>
/// price
/// </summary>
/// <returns></returns>
public override double GetPrice()
{
return this.price;
}
public override void Print()
{
Console.WriteLine("Hamburger is ready! price :$12.00 ");
}
}
/// <summary>
/// Chicken
/// </summary>
public class Chicken : Food {
public Chicken() {
this.Print();
this.price = 18.99;
}
/// <summary>
/// price
/// </summary>
/// <returns></returns>
public override double GetPrice()
{
return this.price;
}
public override void Print()
{
Console.WriteLine("Chicken is ready! price :$18.99 ");
}
}
/// <summary>
/// chips
/// </summary>
public class Chips : Food {
public Chips() {
this.Print();
this.price = 4.44;
}
/// <summary>
/// price
/// </summary>
/// <returns></returns>
public override double GetPrice()
{
return this.price;
}
public override void Print()
{
Console.WriteLine("Chips is ready! price :$4.44 ");
}
}
/// <summary>
/// CocaCala
/// </summary>
public class CocaCala : Drink {
public CocaCala() {
Print();
this.price = 1.00;
}
/// <summary>
/// price
/// </summary>
/// <returns></returns>
public override double GetPrice()
{
return this.price;
}
public override void Print()
{
Console.WriteLine("CocaCala is ready! price = 1.00 ");
}
}
/// <summary>
/// Coffee
/// </summary>
public class Coffee : Drink {
public Coffee()
{
Print();
this.price = 2.00;
}
/// <summary>
/// price
/// </summary>
/// <returns></returns>
public override double GetPrice()
{
return this.price;
}
public override void Print()
{
Console.WriteLine("Coffee is ready! price = 2.00 ");
}
}
}