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

    工厂方法模式

    基本介绍

      工厂方法模式设计方案:将披萨项目的实例化功能抽象成抽象方法,在不同的口味点餐子类中具体实现。

      工厂方法模式:定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类

    应用案例

      披萨项目新的需求:客户在点披萨时,可以点不同口味的披萨,比如 北京的奶酪pizza、北京的胡椒pizza 或者是伦敦的奶酪pizza、伦敦的胡椒pizza

    思路1

      使用简单工厂模式,创建不同的简单工厂类,比如 BJPizzaSimpleFactory、LDPizzaSimpleFactory 等等。从当前这个案例来说,也是可以的,但是考虑到项目的规模,以及软件的可维护性、可扩展性并不是特别好。

    思路2

      使用工厂方法模式

    思路分析图解

    代码演示

    Pizza:所有披萨类的基类,抽象类

    BJCheesePizza:北京奶酪披萨

    BJPepperPizza:北京胡椒披萨

    LDCheesePizza:伦敦奶酪披萨

    LDPepperPizza:伦敦胡椒披萨

    package com.atguigu.factory.factorymethod.pizzastore.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;
        }
    }
    Pizza
    package com.atguigu.factory.factorymethod.pizzastore.pizza;
    
    public class BJCheesePizza extends Pizza {
    
        @Override
        public void prepare() {
            setName("北京奶酪披萨");
            System.out.println("北京奶酪披萨 准备原料");
        }
    }
    BJCheesePizza
    package com.atguigu.factory.factorymethod.pizzastore.pizza;
    
    public class BJPepperPizza extends Pizza {
        @Override
        public void prepare() {
            setName("北京胡椒披萨");
            System.out.println("北京胡椒披萨 准备原料");
        }
    }
    BJPepperPizza
    package com.atguigu.factory.factorymethod.pizzastore.pizza;
    
    public class LDCheesePizza extends Pizza {
    
        @Override
        public void prepare() {
            setName("伦敦奶酪披萨");
            System.out.println("伦敦奶酪披萨 准备原料");
        }
    }
    LDCheesePizza
    package com.atguigu.factory.factorymethod.pizzastore.pizza;
    
    public class LDPepperPizza extends Pizza {
        @Override
        public void prepare() {
            setName("伦敦胡椒披萨");
            System.out.println("伦敦胡椒披萨 准备原料");
        }
    }
    LDPepperPizza

    OrderPizza:订购披萨的抽象类

    package com.atguigu.factory.factorymethod.pizzastore.order;
    
    import com.atguigu.factory.factorymethod.pizzastore.pizza.Pizza;
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    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 type:");
                String str = strin.readLine();
                return str;
            } catch (IOException e) {
                e.printStackTrace();
                return "";
            }
        }
    }
    OrderPizza
    package com.atguigu.factory.factorymethod.pizzastore.order;
    
    import com.atguigu.factory.factorymethod.pizzastore.pizza.BJCheesePizza;
    import com.atguigu.factory.factorymethod.pizzastore.pizza.BJPepperPizza;
    import com.atguigu.factory.factorymethod.pizzastore.pizza.Pizza;
    
    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;
        }
    }
    BJOrderPizza
    package com.atguigu.factory.factorymethod.pizzastore.order;
    
    import com.atguigu.factory.factorymethod.pizzastore.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;
        }
    }
    LDOrderPizza
    package com.atguigu.factory.factorymethod.pizzastore.order;
    
    /**
     * 测试类
     */
    public class PizzaStore {
        public static void main(String[] args) {
    
            String loc = "bj";
            if (loc.equals("bj")){
                // 创建北京的口味的各种Pizza
                new BJOrderPizza();
            }else {
                // 创建伦敦的口味的各种Pizza
                new LDOrderPizza();
            }
        }
    }
    PizzaStore
  • 相关阅读:
    Leetcode Spiral Matrix
    Leetcode Sqrt(x)
    Leetcode Pow(x,n)
    Leetcode Rotate Image
    Leetcode Multiply Strings
    Leetcode Length of Last Word
    Topcoder SRM 626 DIV2 SumOfPower
    Topcoder SRM 626 DIV2 FixedDiceGameDiv2
    Leetcode Largest Rectangle in Histogram
    Leetcode Set Matrix Zeroes
  • 原文地址:https://www.cnblogs.com/zhaye/p/11243342.html
Copyright © 2011-2022 走看看