当前位置: 首页 > article >正文

工厂方法示例

工厂方法

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

示例:

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

http://www.kler.cn/a/6682.html

相关文章:

  • idea 如何安装 github copilot
  • 构建优雅、高效的 Nodejs 命令行工具 - Archons
  • “飞的”点外卖,科技新潮流来袭
  • Deep4SNet: deep learning for fake speech classification
  • 【PyQt】如何在mainwindow中添加菜单栏
  • 【C++】多线程
  • CDH6.3.2大数据集群生产环境安装(五)之httpd和clouderManagerServer、agent组件安装
  • Java基础之Set
  • 2023蓝牙耳机哪个品牌的质量好?耐用的蓝牙耳机推荐
  • 《只有全力奔跑过才知道的事 》大迫杰
  • 【Linux】线程概念
  • 变量的作用域练习题-课后程序(JavaScript前端开发案例教程-黑马程序员编著-第4章-课后作业)
  • Java判断请求是来自手机端还是PC端
  • select @@basedir;
  • pytorch中torch.cat() 和paddle中的paddle.concat()函数用法
  • CAD命令行怎么恢复到初始状态?CAD命令行窗口恢复步骤
  • IDEA 2023.1 正式发布,新特性简介
  • 【MySQL高级篇】 第10章_索引优化与查询优化
  • 【面试】业务中台是什么?
  • 3C认证是什么意思
  • 一刷代码随想录总结
  • 【ssl认证、证书】Wireshark抓包分析
  • Android系统启动过程小结
  • ChatGPT惨遭围剿?多国封杀、近万人联名抵制……
  • 【Unity编辑器扩展】语言国际化工具,生成多语言Excel自动翻译并导出多语言表
  • 如何使用LaTeX中的命令【博文生成:ChatGPT 3.5】