• 工厂模式


    概念:

      工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

    上一篇博文我们了解了简单工厂模式,我们创建一个简单的工厂去创建披萨,但是我们只能创建一种风味的披萨,比如原生

    风味的披萨,如果我们想再创建一种风味的披萨工厂,我们只能再创建一个对应的工厂。此时我们的披萨也不得不跟着也要

    创建一个,这样程序就耦合了。所以我们来看看如何用工厂模式解决这个问题。

    代码实现: 

      1,还是先定义披萨接口以及原生风味和纽约风味各自两种披萨(奶酪和蛤蜊)

    package factorymode.factory;
    
    /**
     * @ClassName Pizaa
     * @Description 定义披萨接口
     * @Author liuyi
     * @Date 2020/6/15 20:50
     * @Version 1.0
     */
    public interface Pizaa {
    
        //准备
        public void prepare();
        //烘烤
        public void bake();
        //切片
        public void cut();
        //包装
        public void box();
    
    }
    

      

    package factorymode.factory;
    /**
     * @ClassName CheesePizza
     * @Description 奶酪披萨
     * @Author liuyi
     * @Date 2020/6/15 20:58
     * @Version 1.0
     */
    public class CheesePizza implements Pizaa{
        @Override
        public void prepare() {
            System.out.println("准备生产奶酪披萨");
        }
    
        @Override
        public void bake() {
            System.out.println("烘烤奶酪披萨");
        }
    
        @Override
        public void cut() {
            System.out.println("切片奶酪披萨");
        }
    
        @Override
        public void box() {
            System.out.println("包装奶酪披萨");
        }
    }
    

      

    package factorymode.factory;
    /**
     * @ClassName ClamPizza
     * @Description 蛤蜊披萨
     * @Author liuyi
     * @Date 2020/6/15 21:00
     * @Version 1.0
     */
    public class ClamPizza implements Pizaa{
        @Override
        public void prepare() {
            System.out.println("准备生产蛤蜊披萨");
        }
    
        @Override
        public void bake() {
            System.out.println("烘烤蛤蜊披萨");
        }
    
        @Override
        public void cut() {
            System.out.println("切片蛤蜊披萨");
        }
    
        @Override
        public void box() {
            System.out.println("包装蛤蜊披萨");
        }
    }
    

      

    package factorymode.factory;
    
    /**
     * @ClassName CheesePizza
     * @Description 奶酪披萨
     * @Author liuyi
     * @Date 2020/6/15 20:58
     * @Version 1.0
     */
    public class NewYorkCheesePizza implements Pizaa{
        @Override
        public void prepare() {
            System.out.println("准备生产纽约风味奶酪披萨");
        }
    
        @Override
        public void bake() {
            System.out.println("烘烤纽约风味奶酪披萨");
        }
    
        @Override
        public void cut() {
            System.out.println("切片纽约风味奶酪披萨");
        }
    
        @Override
        public void box() {
            System.out.println("包装纽约风味奶酪披萨");
        }
    }
    

      

    package factorymode.factory;
    
    /**
     * @ClassName ClamPizza
     * @Description 蛤蜊披萨
     * @Author liuyi
     * @Date 2020/6/15 21:00
     * @Version 1.0
     */
    public class NewYorkClamPizza implements Pizaa{
        @Override
        public void prepare() {
            System.out.println("准备生产蛤蜊披萨");
        }
    
        @Override
        public void bake() {
            System.out.println("烘烤蛤蜊披萨");
        }
    
        @Override
        public void cut() {
            System.out.println("切片蛤蜊披萨");
        }
    
        @Override
        public void box() {
            System.out.println("包装蛤蜊披萨");
        }
    }

      2,定义一个创建对象的抽象类,这里为什么不是接口,其实不管是接口还是抽象类都是多态的一种呈现,这里用抽象类

    的目的就是固定生产披萨的流程准备,烘烤,切面,封装(不能让我们的加盟店偷工减料,砸了自己的招牌。。。。)

    package factorymode.factory;
    /**
    * @ClassName PizzaStrore
    * @Description 定义购买披萨的商店的抽象类
    * @Author liuyi
    * @Date 2020/6/15 21:07
    * @Version 1.0
    */
    public abstract class PizzaStrore {
    //订购披萨方法
    public Pizaa orderPizza(String type){
    Pizaa pizaa;
    pizaa = createPizza(type);
    pizaa.prepare();
    pizaa.bake();
    pizaa.cut();
    pizaa.box();
    return pizaa;
    }
    //定义抽象的创建披萨的方法
    abstract Pizaa createPizza(String type);
    }

      3,为了迎合纽约市民的口味,在纽约附近创建一个纽约风味披萨店,即创建一个商店的具体实现类。子类自己去实现获取对象的方法

    package factorymode.factory;
    
    /**
     * @ClassName PrimaryPizzaStrore
     * @Description TODO
     * @Author liuyi
     * @Date 2020/6/16 23:32
     * @Version 1.0
     */
    public class NewYorkPizzaStrore extends PizzaStrore {
        @Override
        Pizaa createPizza(String type) {
            Pizaa pizaa = null;
            switch (type){
                case "cheese":
                    pizaa = new NewYorkCheesePizza();
                    break;
                case "clam":
                    pizaa = new NewYorkClamPizza();
                    break;
            }
            return pizaa;
        }
    }
    

      4,最后我们来看看如何生产一个纽约风味的奶酪披萨。

    package factorymode.factory;
    
    /**
     * @ClassName Test
     * @Description TODO
     * @Author liuyi
     * @Date 2020/6/16 23:34
     * @Version 1.0
     */
    public class Test {
        public static void main(String[] args) {
            //创建一个纽约风味的披萨商店
            PizzaStrore pizzaStrore = new NewYorkPizzaStrore();
            //调用orderPizza方法生产奶酪披萨
            pizzaStrore.orderPizza("cheese");
    //        PizzaStrore pizzaStrore = new PrimaryPizzaStrore();
    //        pizzaStrore.orderPizza("cheese");
        }
    }
    

      

      分析生产披萨的流程,首先定义一个我们需要的风味披萨店,然后生产我们想要的披萨种类。此时我们再来看抽象披萨商店PizzaStrore,

     在orderPizza方法中调用了createPiazza方法去创建披萨,但是我们在进行4个加工步骤的时候其实是不知道具体是什么类型的披萨的,达到了解耦的目的。

    如果我们还要增加一种风味的商店,只需要创建一个类继承PizzaStrore,然后自己去实现创建对应风味的披萨对象的方法,这样我们的购买流程代码基本

    不会改变,只是需要创建对应的商店即可,这样我们的代码就相比于简单工厂更利于扩展,更加灵活。

  • 相关阅读:
    mysql远程执行sql脚本
    数据库死锁
    sqlserver 数据库之调优
    sqlserver 数据库之性能优化
    Session共享的解决办法
    关于对session机制的理解--通俗易懂
    kafka之常用命令
    分布式消息队列之kafka
    vuejs调试代码
    json
  • 原文地址:https://www.cnblogs.com/liu-yi/p/13150037.html
Copyright © 2020-2023  润新知