• 设计模式:创建型->工厂模式


    在我们平常创建对象的时候,都是通过关键字 new 来实现的,例:Class A = new A() 。
     
    在一些情况下,要创建的对象需要一系列复杂的初始化操作,比如查配置文件、查数据库表、初始化成员对象等,如果把这些逻辑放在构造函数中,会极大影响代码的可读性。不妨定义一个类来专门负责对象的创建,这样的类就是工厂类,这种做法就是工厂模式,在任何需要生成复杂对象的地方,都可以使用工厂模式。
     
    工厂模式包括:简单工厂(不在23种设计模式中)、工厂方法抽象工厂
     

    简单工厂

    简单工厂一开始真的很简单

    public class MaskFactory {
    
        public Mask createMask() {
            Mask mask = new Mask();
            // .....
            // 100行初始化代码
            return mask;
        }
    }

    口罩工厂类只需要new一个口罩对象,配置好,返回即可

    但假如我们需要口罩类的子类,就会比较判断,变成了要加if-else了

    假设口罩类是个接口,有两个子类“高端口罩”和“低端口罩”分别实现了这个接口:

    public interface IMask {
        void show();
    }
    
    public class HighEndMask implements IMask {
        @Override
        public void show() {
            System.out.println("我是高端口罩");
        }
    }
    
    public class LowEndMask implements IMask {
        @Override
        public void show(){
            System.out.println("我的低端口罩");
        }
    
    }

    在工厂中(还是口罩工厂),通过加if-else判断来生产对象

    public class MaskFactory{
    
        public IMask createMask(String type) {
            IMask mask = null;
            if("高端口罩".equals(type)){
                mask = new HighEndMask();
                // .....
                // HighEndMask的100行初始化代码
            }else if("低端口罩".equals(type)){
                mask =  new LowEndMask();
                // .....
                // LowEndMask的100行初始化代码
            }
            return mask;
        }
    }

    客户端传递字符串参数,枚举什么的,都行

    public class Test {
    
        public static void main(String[] args) {
            MaskFactory factory = new MaskFactory();
            IMask maskA = factory.createMask("高端口罩");
            IMask maskB = factory.createMask("低端口罩");
            maskA.show();
            maskB.show();
        }
    }

    不过这违反了开闭原则,对“扩展”开放,对“修改”封闭

    工厂方法模式

    每一个口罩子类都对应一个工厂的子类

    public interface IMaskFactory {
        IMask createMask();
    }
    
    public class HighEndFactory implements IMaskFactory{
    
        @Override
        public IMask createMask() {
            IMask mask =  new HighEndMask();
            // .....
            // HighEndMask的100行初始化代码
            return mask;
        }
    }
    
    public class LowEndFactory implements IMaskFactory{
    
        @Override
        public IMask createMask() {
            IMask mask =  new LowEndMask();
            // .....
            //  LowEndMask的100行初始化代码
            return mask;
        }
    }

    客户端调不同的工厂即可

    public class Test {
    
        public static void main(String[] args) {
            IMaskFactory factoryA = new LowEndFactory();
            IMaskFactory factoryB = new HighEndFactory();
            IMask maskA = factoryA.createMask();
            IMask maskB = factoryB.createMask();
            maskA.show();
            maskB.show();
        }
    }

    这一看就感觉一眼难尽。。。

    抽象工厂

    https://zhuanlan.zhihu.com/p/243277598

    本来以为有什么不同的,结果只是进行了以下组合。。。

     高端工厂类中有两个方法,制造高端口罩,制造高端防护服

    其实很好理解。。。

     所谓抽象工厂模式就是提供一个接口,用于创建相关或者依赖对象的家族,而不需要明确指定具体类。他允许客户端使用抽象的接口来创建一组相关的产品,而不需要关系实际产出的具体产品是什么。这样一来,客户就可以从具体的产品中被解耦

    工厂模式的应用

    例如spring中的bean

  • 相关阅读:
    现在连Linux都搞不懂,当初我要是这么学习操作系统就好了!
    一时技痒,撸了个动态线程池,源码放Github了
    Java线程池ThreadPoolExecutor使用和分析(一)
    canch----1.对缓存的思考
    1.java 内存数据库--H2数据库使用指南
    What’s the difference between persist, save, merge and update? Which one should you use?
    primary key's generator in JPA entity
    STM32F103驱动M24256 256k存储芯片进行读写
    【Proteus+51单片机学习笔记】-51/52系列单片机简介
    【STM32项目笔记】STM32CubeMX+Keil+Proteus联合实现LED闪烁
  • 原文地址:https://www.cnblogs.com/take-it-easy/p/14600252.html
Copyright © 2020-2023  润新知