抽象工厂模式--HeadFirst学习

来源:互联网 发布:店铺形象设计淘宝 编辑:程序博客网 时间:2024/04/30 18:25

一、模式定义:

抽象工厂模式提供了一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。抽象工厂允许用户使用抽象的接口创建一组相关的产品,而不需要知道实际产出的具体产品是什么。这样一来,客户就从具体的产品中解耦。

二、与工厂方法之间关系:

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");        }    }}



0 0
原创粉丝点击