//以下文字内容摘自网络;
工厂方法模式是为了克服简单工厂模式的缺点而设计出来的,简单工厂模式的工厂类随着产品类的增加需要增加额外的代码),而工厂方法模式每个具体工厂类只完成单个实例的创建,所以它具有很好的可扩展性。但是在现实生活中,一个工厂只创建单个产品这样的例子很少,因为现在的工厂都多元化了,一个工厂创建一系列的产品,如果我们要设计这样的系统时,工厂方法模式显然在这里不适用,然后抽象工厂模式却可以很好地解决一系列产品创建的问题.
抽象工厂模式:提供一个创建产品的接口来负责创建相关或依赖的对象,而不具体明确指定具体类,抽象工厂允许客户使用抽象的接口来创建一组相关产品,而不需要知道或关心实际生产出的具体产品是什么。这样客户就可以从具体产品中被解耦.
抽象工厂模式将具体产品的创建延迟到具体工厂的子类中,这样将对象的创建封装起来,可以减少客户端与具体产品类之间的依赖,从而使系统耦合度低,这样更有利于后期的维护和扩展,这真是抽象工厂模式的优点所在,然后抽象模式同时也存在不足的地方.
知道了抽象工厂的优缺点之后,也就能很好地把握什么情况下考虑使用抽象工厂模式了,下面就具体看看使用抽象工厂模式的系统应该符合那几个前提:
- 一个系统不要求依赖产品类实例如何被创建、组合和表达的表达,这点也是所有工厂模式应用的前提。
- 这个系统有多个系列产品,而系统中只消费其中某一系列产品
- 系统要求提供一个产品类的库,所有产品以同样的接口出现,客户端不需要依赖具体实现
具体代码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 ");
}
}
}