一、模式定义:
抽象工厂模式提供了一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。抽象工厂允许用户使用抽象的接口创建一组相关的产品,而不需要知道实际产出的具体产品是什么。这样一来,客户就从具体的产品中解耦。
二、与工厂方法之间关系:
1、抽象工厂在创建距离工厂的时候是通过工厂方法来实现的;
2、抽象工厂需要定义若干个方法用于创建一个产品家族,而工厂方法只需要一个方法创建一类对象即可;
3、两者都是为了将实例化对象的事情抽象出来单独处理;
三、抽象工厂例子代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AbstractFactoryPattern
{
public abstract class PizzaStore
{
public void orderPizza(string type)
{
Pizza pizza = createPizza(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}
protected abstract Pizza createPizza(string type);
}
public abstract class Pizza
{
protected string m_Dough;
protected string m_Sauce;
protected string m_Cheese;
protected string m_Clam;
protected string m_Pepper;
public abstract void prepare();
public void bake()
{
Console.WriteLine("Bake Over");
}
public void cut()
{
Console.WriteLine("Cut Over");
}
public void box()
{
Console.WriteLine("Box Over");
}
}
public abstract class IngredientFactory
{
public abstract string CreateDough();
public abstract string CreateSauce();
public abstract string CreateCheese();
public abstract string CreatePepper();
public abstract string CreateClam();
}
public class NYIngredientFactory : IngredientFactory
{
public override string CreateDough() { return "NYIngredientFactory" + "_Dough"; }
public override string CreateSauce() { return "NYIngredientFactory" + "_Dough"; }
public override string CreateCheese() { return "NYIngredientFactory" + "_Cheese"; }
public override string CreatePepper() { return "NYIngredientFactory" + "_Pepper"; }
public override string CreateClam() { return "NYIngredientFactory" + "_Clam"; }
}
public class CGIngredientFactory : IngredientFactory
{
public override string CreateDough() { return "CGIngredientFactory" + "_Dough"; }
public override string CreateSauce() { return "CGIngredientFactory" + "_Dough"; }
public override string CreateCheese() { return "CGIngredientFactory" + "_Cheese"; }
public override string CreatePepper() { return "CGIngredientFactory" + "_Pepper"; }
public override string CreateClam() { return "CGIngredientFactory" + "_Clam"; }
}
public class ClamPizza : Pizza
{
private IngredientFactory m_pFactory;
public ClamPizza(IngredientFactory pFactory)
{
m_pFactory = pFactory;
}
public override void prepare()
{
Console.WriteLine("ClamPizza");
m_Dough = m_pFactory.CreateDough();
m_Sauce = m_pFactory.CreateSauce();
m_Cheese = m_pFactory.CreateCheese();
m_Clam = m_pFactory.CreateClam();
m_Pepper = m_pFactory.CreatePepper();
}
}
public class CheesePizza : Pizza
{
private IngredientFactory m_pFactory;
public CheesePizza(IngredientFactory pFactory)
{
m_pFactory = pFactory;
}
public override void prepare()
{
Console.WriteLine("CheesePizza");
m_Dough = m_pFactory.CreateDough();
m_Sauce = m_pFactory.CreateSauce();
m_Cheese = m_pFactory.CreateCheese();
m_Clam = m_pFactory.CreateClam();
m_Pepper = m_pFactory.CreatePepper();
}
}
public class VeggiePizza : Pizza
{
private IngredientFactory m_pFactory;
public VeggiePizza(IngredientFactory pFactory)
{
m_pFactory = pFactory;
}
public override void prepare()
{
Console.WriteLine("VeggiePizza");
m_Dough = m_pFactory.CreateDough();
m_Sauce = m_pFactory.CreateSauce();
m_Cheese = m_pFactory.CreateCheese();
m_Clam = m_pFactory.CreateClam();
m_Pepper = m_pFactory.CreatePepper();
}
}
public class PepperOniPizza : Pizza
{
private IngredientFactory m_pFactory;
public PepperOniPizza(IngredientFactory pFactory)
{
m_pFactory = pFactory;
}
public override void prepare()
{
Console.WriteLine("PepperOniPizza");
m_Dough = m_pFactory.CreateDough();
m_Sauce = m_pFactory.CreateSauce();
m_Cheese = m_pFactory.CreateCheese();
m_Clam = m_pFactory.CreateClam();
m_Pepper = m_pFactory.CreatePepper();
}
}
public class NYPizzaStore : PizzaStore
{
protected override Pizza createPizza(string type)
{
Pizza pizza = null ;
IngredientFactory pFactory = new NYIngredientFactory();
if (type == "Cheese")
pizza = new CheesePizza(pFactory);
if (type == "Clam")
pizza = new ClamPizza(pFactory);
if (type == "Veggie")
pizza = new VeggiePizza(pFactory);
if (type == "PepperOni")
pizza = new PepperOniPizza(pFactory);
return pizza;
}
}
public class ChicagoPizzaStore : PizzaStore
{
protected override Pizza createPizza(string type)
{
Pizza pizza = null;
IngredientFactory pFactory = new CGIngredientFactory();
if (type == "Cheese")
pizza = new CheesePizza(pFactory);
if (type == "Clam")
pizza = new ClamPizza(pFactory);
if (type == "Veggie")
pizza = new VeggiePizza(pFactory);
if (type == "PepperOni")
pizza = new PepperOniPizza(pFactory);
return pizza;
}
}
}
namespace FactoryMethodPattern
{
class Program
{
static void Main(string[] args)
{
PizzaStore nyStore = new NYPizzaStore();
nyStore.orderPizza("Cheese");
PizzaStore cgStore = new ChicagoPizzaStore();
cgStore.orderPizza("Clam");
}
}
}