工厂模式
1.简介
1.1、作用:
实现创建者和调用者的分离。
1.2、核心本质
- 实例化对象不使用new,用工厂方法代替。
- 将选择实现类,创建对象统一管理和控制。从而将调用者跟我们的实现类解耦。
1.3、详细分类
-
简单(静态)工厂模式
用来生产同一等级结构中的任意产品(对于增加新的产品,需要修改已有代码)。
-
工厂方法模式
用来生产同一等级结构中的固定产品(支持增加任意产品)。
-
抽象工厂模式
围绕一个抽象工厂创建其他工厂,该抽象工厂又称为其他工厂的工厂。
相关OOP原则
- 开闭原则:对扩展开放,对修改关闭。(即只扩展,不修改。)
- 迪米特法则:最少知道原则,一个类尽量少的和其他类发生相互作用。
- 依赖倒置原则:真正面向抽象编程,而不是依赖于具体。
2、简单(静态)工厂模式
2.1、优点
- 客户端创建对象时只需要记住特定的参数,而不需要记住复杂的类名,也不用关注实现的过程。(实现了封装和部分解耦)。
- 创建对象不需要单独实例化,而是通过工厂类直接获取示例(实现复用)
2.2、缺点
- 实例化对象的逻辑全部封装在一个工厂类里,每次需求变化都要单独修改工厂类(违反了开闭原则),而且出了异常可能没法正常工作。
- 不方便扩展子类。
2.3、应用场景
适合业务简单或者产品较少的情况
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、应用场景
符合工厂模式的情况,多由于解耦。
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、总结
简单工厂在
- 结构复杂度
- 代码复杂度
- 编程复杂度
- 管理上的复杂度
都优于 工厂方法模式
虽然根据设计原则应该使用工厂 方法模式,但是考虑到实际业务,简单工厂模式优先。