• Java设计模式之工厂设计模式


    1.什么是-工厂设计模式

    工厂模式有多种写法,你可以通过继承父类来实现,实现抽象类的方法或者实现接口。然而工程模式又分两种编写模式,有抽象工厂,简单工厂。我们这里就从简单的工厂模式开始说起,我们要知道工厂模式的目的是什么?工厂模式的目的在于程序的可扩展性。而对于简单工厂模式来说,它是为了让程序有一个更好地封装,降低程序模块之间的耦合程度。

      对于简单的工厂模式,其实也可以将其理解成为一个创建对象的工具类。

    2.设计模式示例

    2.1.示例背景

    这里的示例是以吃货点餐做为背景。很多餐厅的点餐步骤呢是餐厅有服务员,每当看见有客人进来的时候会给你一个菜单然后让你挑选自己中意的菜,选择好后呢,服务员在推到厨房去,这个时候厨房会有一个专门查看推送过来的菜单,然后在根据菜品类型给你选择性的交给擅长做炒菜的厨师还是擅长做蒸菜的厨师。那么这里的这个负责查看推送菜单的角色就是我们的工厂模式中的创建者(KitchenFactory)负责根据业务需求来实现对应的逻辑代码或者实例对应的对象。厨房菜品分类员推送到真正的做菜厨师后厨师在进行菜品制作,这里的厨师就是分别Cooking(擅长炒菜类型的厨师),Steamed(擅长蒸菜的厨师)。那么他们都共有一个工作,就是为客户做菜。那么这个共有的动作是不是可以抽象出来。抽象出来后就是Kitchen类,有一个方法叫做菜的动作。(这里可以根据业务需求实现场景来决定是使用抽象类还是接口的方式实现,我这里使用普通的类在被继承。)父类抽出来的这个动作只是负责反馈给传菜员,子类的重写这个动作方法才是具体的描述。

    2.2.代码区域

    2.2.1.建一个菜单类,用来传递接受菜单信息

    /**
     * 传递菜单
     */
    public class MenuModel {
    
    
        public String getWeight() {
            return weight;
        }
    
        public void setWeight(String weight) {
            this.weight = weight;
        }
    
        /**
         * 菜名编号
         */
        private Integer dish;
    
        public Integer getDish() {
            return dish;
        }
    
        public void setDish(Integer dish) {
            this.dish = dish;
        }
    
        /**
         * 分量 10,15
         */
        private String weight;
    
    }

    2.2.2.建一个厨房类

    /**
     * 厨房工厂类
     */
    public   class Kitchen {
    
        public  void cooking(MenuModel menuModel){
            System.out.println("菜已制作完成----上菜咯,小二。");
        }
    }

    2.2.3.建一个厨房工厂类

    public class KitchenFactory {
    
        /**
         * 厨房工厂-为客户点的菜分类处理后交个后厨进行制作
         * @param menuModel
         * @return
         */
        public static Kitchen createKitchen(MenuModel menuModel) {
            Kitchen kitchen=null;
            switch (menuModel.getDish()){
                case 1:
                    /*炒菜*/
                    kitchen=new Cooking();
                    break;
                case 2:
                      /*蒸菜*/
                    kitchen=new Steamed();
                    break;
            }
            return  kitchen;
        }
    }

    2.2.4.新建擅长做炒菜的厨师类

    public class Cooking extends  Kitchen {
    
        @Override
        public void cooking(MenuModel menuModel) {
            System.out.println(String.format("我点菜了,菜名编号:%s,分量是%s",menuModel.getDish(),menuModel.getWeight()));
            System.out.println("厨房出正在为你炒菜");
            super.cooking(menuModel);//调用父类的共用方法-反馈制作完毕
        }
    }

    2.2.5.新建擅长做蒸菜的厨师类

    public class Steamed extends  Kitchen {
    
        @Override
        public void cooking(MenuModel menuModel) {
            System.out.println(String.format("我点菜了,菜名编号:%s,分量是%s",menuModel.getDish(),menuModel.getWeight()));
            System.out.println("厨房抽出正在为你蒸菜");
            super.cooking(menuModel);//调用父类的共用方法-反馈制作完毕
        }
    }

    2.2.6.新建用户测试类

    public class OrderTest {
        public  static void main(String args[]){
            MenuModel menuModel=new MenuModel();
            menuModel.setDish(2);
            menuModel.setWeight("15");
            Kitchen kitchen=KitchenFactory.createKitchen(menuModel);
            kitchen.cooking(menuModel);
    
        }
    }

    2.3.测试工厂模式点菜

    2.3.1.点菜品编号为1的菜

    我点菜了,菜名编号:1,分量是15
    厨房出正在为你炒菜
    菜已制作完成----上菜咯,小二。
    
    Process finished with exit code 0

    2.3.2.点菜品编号为2的菜

    我点菜了,菜名编号:2,分量是15
    厨房抽出正在为你蒸菜
    菜已制作完成----上菜咯,小二。
    
    Process finished with exit code 0

    执行思路总结:这就是工厂模式,使用面向对象编程的三大特性来实现这个工厂模式。博客记录的工厂模式就是简单的工厂模式,也是生活中很常见的模式。其实不难发现工厂模式有点像职责链模式,分工明确,抽象分类。本文为什么没有使用接口或者抽象类来实现工厂模式呢,是因为有没有发现后面还有一句“菜已制作完成----上菜咯,小二。”这样的反馈动作,因为刚好这个动作就是共有的,就没有写抽象类了。直接来实现了。简单明了

  • 相关阅读:
    给linux用户分配docker权限
    alpine安装docker
    linux开机自启动配置
    virtualbox vdi硬盘扩容
    树莓派更新软件源的脚本
    原生js选中下拉框中指定值
    linux环境tomcat开启远程调试
    Vue2 和 Yii2 进行前后端分离开发学习
    httpd.conf文件中找不到Deny from all这句,怎么配置多站点
    yii2.0 advanced 学习教程
  • 原文地址:https://www.cnblogs.com/david97/p/8080746.html
Copyright © 2020-2023  润新知