工厂方法示例

工厂方法

定义一个创建对象的接口,由子类决定哪个对象被实例化。

示例:

  1. 抽象类PizzaStore,包含方法OrderPizza,抽象方法CreatePizza,
    CreatePizza返回IPizza
  2. PizzaStore的子类NYPizzaStore,ChicagoStore,实现CreatePizza方法
  3. IPizza接口,包含Bake,Prepare,Cut,Box方法
    纽约披萨:NYCheesePizza,NYVeggiePizza,
    芝加哥披萨:ChicagoCheesePizza,ChicagoCheesePizza
  4. 抽象类PizzaStore的OrderPizza方法使用CreatePizza方法制作披萨;
    CreatePizza是工厂方法,它用于创建对象,当其他类继承PizzaStore类时,必须实现CreatePizza方法,从而自定义实例化哪些对象。

优点

添加其他地区的披萨产品,不需要修改PizzaStore,只需要添加新的子类即可。

披萨店 披萨

CreatePizza方法是一个工厂方法
抽象方法CreatePizza决定创建哪个披萨实例

    public abstract class PizzaStore
    {
        public void OrderPizza(string pizzaType)
        {
            IPizza pizza = CreatePizza(pizzaType);
            pizza.Prepare();
            pizza.Bake();
            pizza.Cut();
            pizza.Box();
        }
        protected abstract IPizza CreatePizza(string pizzaType);
    }

纽约披萨店 芝加哥披萨店

    public class NYPizzaStore : PizzaStore
    {
        protected override IPizza CreatePizza(string pizzaType)
        {
            IPizza pizza = null;
            if (pizzaType == "Cheese")
            {
                pizza = new NYCheesePizza();
            }
            else if (pizzaType == "Veggie")
            {
                pizza = new NYVeggiePizza();
            }
            return pizza;
        }
    }
    public class ChicagoPizzaStore : PizzaStore
    {
        protected override IPizza CreatePizza(string pizzaType)
        {
            IPizza pizza = null;
            if (pizzaType == "Cheese")
            {
                pizza = new ChicagoCheesePizza();
            }
            else if (pizzaType == "Veggie")
            {
                pizza = new ChicagoVeggiePizza();
            }
            return pizza;
        }
    }

披萨

    public interface IPizza
    {
        void Prepare();
        void Bake();
        void Cut();
        void Box();
    }

纽约披萨

    public class NYCheesePizza : IPizza
    {
        public void Bake()
        {
            Console.WriteLine("纽约烘焙Cheese");
        }

        public void Box()
        {
            Console.WriteLine("纽约包装Cheese");
        }

        public void Cut()
        {
            Console.WriteLine("纽约分开Cheese");
        }

        public void Prepare()
        {
            Console.WriteLine("纽约准备Cheese");
        }
    }
    public class NYVeggiePizza : IPizza
    {
        public void Bake()
        {
            Console.WriteLine("纽约烘焙Veggie");
        }

        public void Box()
        {
            Console.WriteLine("纽约包装Veggie");
        }

        public void Cut()
        {
            Console.WriteLine("纽约分开Veggie");
        }

        public void Prepare()
        {
            Console.WriteLine("纽约准备Veggie");
        }
    }

芝加哥披萨

    public class ChicagoCheesePizza : IPizza
    {
        public void Bake()
        {
            Console.WriteLine("芝加哥烘焙Cheese");
        }

        public void Box()
        {
            Console.WriteLine("芝加哥包装Cheese");
        }

        public void Cut()
        {
            Console.WriteLine("芝加哥分开Cheese");
        }

        public void Prepare()
        {
            Console.WriteLine("芝加哥准备Cheese");
        }
    }
    public class ChicagoVeggiePizza : IPizza
    {
        public void Bake()
        {
            Console.WriteLine("芝加哥烘焙Veggie");
        }

        public void Box()
        {
            Console.WriteLine("芝加哥包装Veggie");
        }

        public void Cut()
        {
            Console.WriteLine("芝加哥分开Veggie");
        }

        public void Prepare()
        {
            Console.WriteLine("芝加哥准备Veggie");
        }
    }

使用

PizzaStore nyPizzaStore=new NYPizzaStore();
PizzaStore chicagoStore=new ChicagoPizzaStore();

nyPizzaStore.OrderPizza("Veggie");
nyPizzaStore.OrderPizza("Cheese");

chicagoStore.OrderPizza("Veggie");
chicagoStore.OrderPizza("Cheese");

你可能感兴趣的:(设计模式,java,c#)