什么是工厂方法模式
工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但是具体创建哪个类的对象由子类决定。
在工厂方法模式中,我们将对象的创建委托给具体的工厂类,由工厂类来负责创建具体的产品对象。这样,客户端代码只需要关心所需对象的抽象类型,无需关心具体的实现细节,从而实现了解耦。
工厂方法结构
包含角色:
1)抽象工厂:提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法来创建产品。
2)具体工厂:主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
3)抽象产品:定义了产品的规范,描述了产品的主要特性和功能。
4)具体产品:实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。
实现类图:
代码实现
public interface Car{
void carName();
}
public class Bench implements Car {
@Override
public void carName(){
System.out.printIn("奔驰");
}
}
public class Wuling implements Car {
@Override
public void carName(){
System.out.printIn("五菱");
}
}
public interface CarFactory {
Car getCar();
}
public class BenchFactory implements CarFactory {
@Override
public Car getCar(){
return new Bench();
}
}
public class Customer {
public static void main(String[] args){
Car car = new BenchFactory().getCar();
car.carName();
}
}
优点
1、用户只需要知道具体工厂的名字,就可以获取到想要的产品,不需要关注产品的创建过程。
2、在系统新增加产品的时候,只需要添加具体产品类和对应的具体工厂,不需要对原工厂进行修改,满足了开闭原则。
缺点
1、每增加一个产品,就需要一个具体产品类和对应的具体工厂类,这样会增加系统的复杂度。
适用场景:
1)需要使用很多重复代码创建对象时,比如,DAO 层的数据对象、API 层的VO 对象等。
2)创建对象要访问外部信息或资源时,比如,读取数据库字段,获取访问授权token 信息,配置文件等。
3)创建需要统一管理生命周期的对象时,比如,会话信息、用户网页浏览轨迹对象等。
4)创建池化对象时,比如,连接池对象、线程池对象、日志对象等。这些对象的特性是:有限、可重用,使用工厂方法模式可以有效节约资源。
5)希望隐藏对象的真实类型时,比如,不希望使用者知道对象的真实构造函数参数等