zoukankan      html  css  js  c++  java
  • 设计模式之工厂方法模式

    工厂方法模式
    工厂方法模式介绍
    工厂方法模式设计方案:将披萨项目的实例化功能抽象成抽象方法,在不同的口味点
    餐子类中具体实现。
    工厂方法模式:定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方
    法模式将对象的实例化推迟到子类。
     
    工厂方法模式
    工厂方法模式应用案例
    披萨项目新的需求:客户在点披萨时,可以点不同口味的披萨,比如 北京的奶酪
    pizza、北京的胡椒pizza 或者是伦敦的奶酪pizza、伦敦的胡椒pizza
     
    类图:
    //将Pizza 类做成抽象
    public abstract class Pizza {
        protected String name; //名字
    
        //准备原材料, 不同的披萨不一样,因此,我们做成抽象方法
        public abstract void prepare();
    
    
        public void bake() {
            System.out.println(name + " baking;");
        }
    
        public void cut() {
            System.out.println(name + " cutting;");
        }
    
        //打包
        public void box() {
            System.out.println(name + " boxing;");
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    public class BJCheesePizza extends Pizza {
        @Override
        public void prepare() {
            setName("北京的奶酪pizza");
            System.out.println(" 北京的奶酪pizza 准备原材料");
        }
    }
    public class BJPepperPizza extends Pizza {
        @Override
        public void prepare() {
            setName("北京的胡椒pizza");
            System.out.println(" 北京的胡椒pizza 准备原材料");
        }
    }
    public class LDCheesePizza extends Pizza{
        @Override
        public void prepare() {
            setName("伦敦的奶酪pizza");
            System.out.println(" 伦敦的奶酪pizza 准备原材料");
        }
    }
    public class LDPepperPizza extends Pizza{
        @Override
        public void prepare() {
            setName("伦敦的胡椒pizza");
            System.out.println(" 伦敦的胡椒pizza 准备原材料");
        }
    }
    public abstract class OrderPizza {
    
        //定义一个抽象方法,createPizza , 让各个工厂子类自己实现
        abstract Pizza createPizza(String orderType);
    
        // 构造器
        public OrderPizza() {
            Pizza pizza = null;
            String orderType; // 订购披萨的类型
            do {
                orderType = getType();
                pizza = createPizza(orderType); //抽象方法,由工厂子类完成
                //输出pizza 制作过程
                pizza.prepare();
                pizza.bake();
                pizza.cut();
                pizza.box();
    
            } while (true);
        }
        
        // 写一个方法,可以获取客户希望订购的披萨种类
        private String getType() {
            try {
                BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
                System.out.println("input pizza 种类:");
                String str = strin.readLine();
                return str;
            } catch (IOException e) {
                e.printStackTrace();
                return "";
            }
        }
    }
    public class BJOrderPizza extends OrderPizza {
        @Override
        Pizza createPizza(String orderType) {
            Pizza pizza = null;
            if(orderType.equals("cheese")) {
                pizza = new BJCheesePizza();
            } else if (orderType.equals("pepper")) {
                pizza = new BJPepperPizza();
            }
            return pizza;
        }
    }
    public class LDOrderPizza extends OrderPizza {
        @Override
        Pizza createPizza(String orderType) {
            Pizza pizza = null;
            if(orderType.equals("cheese")) {
                pizza = new LDCheesePizza();
            } else if (orderType.equals("pepper")) {
                pizza = new LDPepperPizza();
            }
            return pizza;
        }
    }
    public class PizzaStore {
        public static void main(String[] args) {
            String loc = "bj";
            if (loc.equals("bj")) {
                //创建北京口味的各种Pizza
                new BJOrderPizza();
            } else {
                //创建伦敦口味的各种Pizza
                new LDOrderPizza();
            }
        }
    }

    打印结果:

    摘自韩顺平大神笔记

  • 相关阅读:
    多线程之缓存一致性协议
    Redis基础入门-linux安装
    Linux 上传文件rz 命令提示 -bash: rz: command not found 问题解决办法
    面试题之十亿条记录,怎么获取出现最多的前十个
    设计模式之工厂设计模式
    设计模式之单例设计模式
    数据结构之红黑树
    Eclipse使用Maven创建web3.0项目
    Eclipse创建Maven工程报错
    Oracle中的commit详解
  • 原文地址:https://www.cnblogs.com/liuyi13535496566/p/13287730.html
Copyright © 2011-2022 走看看