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


    在看下面讲解之前,最好还是先看下笔者的 简单工厂模式,因为我的例子,是有联系的;


    目录


    代码

    工厂接口:

    /**
     * 工厂接口,抽象出工厂具体的公有方法
     */
    interface Factory{
        Produce factoryProduce();
    }

    工厂实现类:

    /**
     * 工厂实现类
     */
    class PianoFactory implements Factory{
    
        @Override
        public Produce factoryProduce() {
            return new Piano();
        }
    }
    
    class MotorcycleFactory implements Factory{
    
        @Override
        public Produce factoryProduce() {
            return new Motorcycle();
        }
    }

    测试类:

        @Test
        public void Test(){
    //        客户端需要制造一台钢琴
            Factory factory = new PianoFactory();
            Produce produce = factory.factoryProduce();
            produce.method();
    
    //        客户端制造一台摩托车
            Factory factory1 = new MotorcycleFactory();
            Produce produce1 = factory1.factoryProduce();
            produce1.method();
    
        }

    后期添加新的类(浴缸):

    /**
     * 浴缸类
     */
    class Bathtub implements Produce {
        @Override
        public void method() {
            System.out.println("制造出一个浴缸");
        }
    }
    

    浴缸工厂类:

    class BathtubFactory implements Factory{
    
        @Override
        public Produce factoryProduce() {
            return new Bathtub();
        }
    }

    测试:

    //  对于后期添加的浴缸,客户端不需要改动现有的代码
            Factory factory2 = new BathtubFactory();
            Produce produce2 = factory2.factoryProduce();
            produce2.method();

    图解工厂方法模式

    肚子有点疼

    简单工厂模式 相比,工厂方法模式,更抽象一点,它把工厂也抽象出一个接口来它让一个工厂只负责生产一种产品;


    优点

    简单工厂模式 的优点,继续保持,还克服了 简单工厂模式 的缺点 ;

    • 新增产品,不需要改动现有的代码

    当有新的产品需要添加进框架里面的时候,我们是不需要去改动现有的代码的;只需要写出对应的 产品类工厂实现类;然后在API里面写上新增的产品即可 ;原有的 代码是一行都不需要改动的 ;


    缺点

    • 增加系统的负担
    • 代码量剧增
    • 一个工厂只能生产一个产品

    API 的设计者,新增新的产品的时候,设计者自己就蛋疼的很了,每一新增一个产品,他就需要对应的写一个工厂类,导致代码量剧增;

    客户端在使用的时候,每次使用一个产品类的时候,都需要调用对应的工厂类,无形之中增加了系统的负担 ;


    改进:

    要克服上面的缺点,就需要使用 抽象工厂模式 了 ;

  • 相关阅读:
    【bzoj2733】永无乡(无旋treap启发式合并 + 并查集)
    【bzoj2002】弹飞绵羊(分块)
    【bzoj2724】蒲公英(分块)
    【最大M子段和】dp + 滚动数组
    【最大连续子段和】单调队列 + 前缀和优化
    【广告印刷】单调队列
    【烽火传递】dp + 单调队列优化
    【志愿者选拔】单调队列、输入优化
    【Sliding Window】单调队列
    【序列操作V】平衡树(无旋treap)
  • 原文地址:https://www.cnblogs.com/young-youth/p/11665721.html
Copyright © 2011-2022 走看看