工厂模式:创建者和调用者的分离



1.简介

1.1、作用:

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


1.2、核心本质

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


1.3、详细分类

  • 简单(静态)工厂模式

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

  • 工厂方法模式

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

  • 抽象工厂模式

    ​ 围绕一个抽象工厂创建其他工厂,该抽象工厂又称为其他工厂的工厂。

相关OOP原则

  • 开闭原则:对扩展开放,对修改关闭。(即只扩展,不修改。)
  • 迪米特法则:最少知道原则,一个类尽量少的和其他类发生相互作用。
  • 依赖倒置原则:真正面向抽象编程,而不是依赖于具体。





2、简单(静态)工厂模式

2.1、优点

- 客户端创建对象时只需要记住特定的参数,而不需要记住复杂的类名,也不用关注实现的过程。(实现了封装和部分解耦)。
- 创建对象不需要单独实例化,而是通过工厂类直接获取示例(实现复用)



2.2、缺点

  • 实例化对象的逻辑全部封装在一个工厂类里,每次需求变化都要单独修改工厂类(违反了开闭原则),而且出了异常可能没法正常工作。
  • 不方便扩展子类。



2.3、应用场景

​ 适合业务简单或者产品较少的情况

Consumer
Factory
五菱宏光
Tesla
Car接口
public interface Car {
    
    
    void name();
}
public class Tesla implements Car {
    
    
    @Override
    public void name() {
    
    
        System.out.println("特斯拉!");
    }
}
public class WuLing implements Car{
    
    
    @Override
    public void name() {
    
    
        System.out.println("五菱宏光!");
    }
}
public class CarFactory {
    
    
    public static Car getWuLing(){
    
    
        return new WuLing();
    }
    public static Car getTesla(){
    
    
        return new Tesla();
    }
}
public class Consumer {
    
    
    public static void main(String[] args) {
    
    
        Car car1 = CarFactory.getTesla();
        Car car2 = CarFactory.getWuLing();

        car1.name();
        car2.name();
    }
}





3、工厂方法模式

3.1、介绍:

​ 工厂方法模式将生成具体产品的任务分发给具体的产品工厂,也就是定义一个抽象工厂,将生产任务交给不同的派生类工厂。如下图,当需要新增车型时,增加了Tesla Factory和Tesla。即通过增加新的工厂来达到增加新的车型。


3.1、优点

  • 在简单工厂的基础上遵循了开闭原则,又进行了解耦,工厂类分为具体的工厂类。


3.2、缺点

  • 每增加一个工厂,就要额外开发一个工厂。


3.3、应用场景

​ 符合工厂模式的情况,多由于解耦。

新增
新增
Consumer
WuLing Factory
Tesla Factory
五菱宏光
Tesla
Car Factory
Car
public interface CarFactory {
    
    
    Car getCar();
}
public class WuLingFactory implements CarFactory {
    
    
    @Override
    public Car getCar() {
    
    
        return new WuLing();
    }
}
public class TeslaFactory implements CarFactory{
    
    
    @Override
    public Car getCar() {
    
    
        return new Tesla();
    }
}
public class Consumer {
    
    
    public static void main(String[] args) {
    
    
        Car car1 = new WuLingFactory().getCar();
        Car car2 = new TeslaFactory().getCar();

        car1.name();
        car2.name();
    }
}





4、总结

简单工厂

  • 结构复杂度
  • 代码复杂度
  • 编程复杂度
  • 管理上的复杂度

都优于 工厂方法模式


虽然根据设计原则应该使用工厂 方法模式,但是考虑到实际业务,简单工厂模式优先。





了解其他设计模式

猜你喜欢

转载自blog.csdn.net/qq_44972847/article/details/108058246