• 设计模式之工厂模式


    工厂模式

    作用

    实现了创建者和调用者的分离

    核心本质

    • 实例化对象不使用new,用工厂方法代替
    • 将选择实现类,创建对象统一管理和控制。从而将调用者跟我们的实现类解耦。

    简单工厂模式

    用来生产同一等级结构中的任意产品(对于增加新的产品,需要覆盖已有代码)

    工厂方法模式

    用来生产同一等级结构中的固定产品(支持增加任意产品)

    抽象工厂模式

    围统一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。

    原来的设计

    Car接口

    public interface Car {
        void name();
    }
    

    Tesla实现Car接口

    public class Tesla implements Car{
    
        @Override
        public void name() {
            System.out.println("特斯拉!");
        }
    }
    

    WuLing实现Car接口

    public class WuLing implements Car{
    
        @Override
        public void name() {
            System.out.println("五菱宏光");
        }
    }
    
    

    Consumer

    public class Consumer {
        public static void main(String[] args) {
            Car car1 = new WuLing();
            Car car2 = new Tesla();
            car1.name();
            car2.name();
    
        }
    }
    

    image-20220925113845689

    面向对象的话,你买车不需要知道具体,只需要知道什么车,你new车相当于造车,我们只需要从工厂里买

    新建一个工厂,我们只需要告诉工厂要什么车,就可以得到。不用管细节

    public class CarFactory {
        public static Car getCar(String car) {
            if (car.equals("五菱")) {
                return new WuLing();
            } else if (car.equals("特斯拉")) {
                return new Tesla();
            }else {
                return null;
            }
        }
    

    消费者

      //使用工厂
            Car car = CarFactory.getCar("五菱");
            car.name();
    

    工厂的缺点

    在加个车大众,还需要在CarFactory中修改,违反了开闭原则

    这样写,虽然不用改原来的逻辑了,但还是要增加一些新代码

    image-20220925114953379

    消费者不用去关心细节

    image-20220925145315389

    工厂方法模式

    每个车的工厂类实现工厂接口,然后消费者只需要调用对应工厂就可以得到车

    当新加一个车的时候,只需要增加对应工厂类实现工厂接口

    Car接口

    public interface Car {
        void name();
    }
    

    所有车都要实现Car接口

    public class Tesla implements Car {
    
        @Override
        public void name() {
            System.out.println("特斯拉!");
        }
    }
    
    public class WuLing implements Car {
    
        @Override
        public void name() {
            System.out.println("五菱宏光");
        }
    }
    

    CarFactory接口

    public interface CarFactory {
        Car getCar();
    }
    

    所有的工厂都必须实现工厂接口

    public class TeslaFactory implements CarFactory{
        @Override
        public Car getCar() {
            return new Tesla();
        }
    }
    
    public class WuLingFactory implements CarFactory{
        @Override
        public Car getCar() {
            return new WuLing();
        }
    }
    

    新增的时候,加一个车类加一个工厂类,符合开闭原则

    public class MoBai implements Car{
    
        @Override
        public void name() {
            System.out.println("摩拜单车");
        }
    }
    

    消费者

    public class Consumer {
        public static void main(String[] args) {
            Car car = new WuLingFactory().getCar();
            Car car1 = new MoBaiFactory().getCar();
            car.name();
            car1.name();
        }
    }
    

    工厂方法模型

    image-20220925151040263

    image-20220925151241037

    工厂类越来越多


    结构复杂度:简单工厂模式低

    代码复杂度:简单工厂模式低

    编程复杂度:简单工厂模式低

    管理复杂度:简单工厂模式低

    根据设计原则:使用工厂方法模式

    实际业务:简单工厂模式


  • 相关阅读:
    大都会人寿线下培训第九天-通关了
    codeforces每日5题(均1700)
    python特殊函数之__call__函数的作用
    HDFS文件读取流程
    RDB、AOF 阻塞操作?
    《深入浅出OCR》第三章:OCR文字检测
    DS@命题公式等值演算@常用等值式模式
    预算有限但想改善客户服务?教你几招轻松解决~
    基于无人机的气象数据采集系统设计(Matlab代码实现)
    IPV6协议总结
  • 原文地址:https://blog.csdn.net/qq_46110710/article/details/127040955