目录
工厂方法模式概念
当我们需要创建不同类型的对象时,可以使用工厂方法模式。这种模式可以让我们根据需要创建具体的对象,而不需要在代码中直接实例化它们。
如果我们使用简单工厂模式来创建飞机,可能会遇到一些问题。比如,简单工厂模式可以创建直升机、战斗机和波音747,但如果我们想要新增一个水上飞机,就需要修改工厂的源代码。这明显违反了开闭原则,即对扩展开放,对修改关闭。为了解决这个问题,我们可以使用工厂方法模式。工厂方法模式提供一个抽象的工厂接口,让子类来决定具体创建哪个对象的实例。每个具体工厂类负责创建一种特定类型的产品。
工厂方法模式的核心思想是将对象的创建延迟到子类中。这样,当我们需要新增一种产品时,只需要创建一个新的具体产品类和对应的具体工厂类,而无需修改已有的代码。
通过使用工厂方法模式,我们可以实现代码的扩展性和灵活性。新增产品时,只需添加相应的具体产品类和具体工厂类,不会对已有代码造成影响。而且,客户端只需要关注抽象工厂类和产品类的接口,无需关心具体的创建细节。
但需要注意的是,工厂方法模式会增加系统的复杂性。每个具体产品都需要对应一个具体工厂类,这会增加类的数量。因此,在选择使用工厂方法模式时,我们需要考虑系统的可维护性和可读性。
UML图
Product:它是定义产品的接口,是工厂方法模式所创建的产品的父类。
ConcreteProduct:具体产品.
Factory:抽象工厂类中声明了工厂方法。
ConcreteFactory:具体的工厂方法,继承了抽象工厂类,用来生产具体的对象。
工厂方法的实例
首先有一个抽象工厂
/**
* 抽象工厂类
*/
public interface IFactory {
IProduct createPro(String params);
}
具体的工厂类需要实现这个抽象工厂的接口
实现了公共工厂方法,并返回一个具体产品类的实例对象。通常情况下,与具体产品类一一对应。
/**
* 具体工厂类
*/
public class FacImplA implements IFactory {
// 创建产品A
@Override
public IProduct createPro(String params) {
ProImplA pro = new ProImplA();
// 执行相关业务逻辑
return pro;
}
}
抽象产品类
工厂方法模式所创建对象的公共父类,定义了一组具有子类共性的公共方法,和子类独的抽象方法。
/**
* 抽象产品类
*/
public interface IProduct {
// 公共方法
default void methodShared(){
// 业务逻辑
}
// 不同方法
void methodDiff(String params);
}
具体产品类
/**
* 具体产品类
*/
public class ProImplA implements IProduct {
// 不同执行逻辑的方法
@Override
public void methodDiff(String params) {
// 不同处理逻辑
}
}
优缺点
优点
能够让工厂自主的确定创建何种产品对象,而具体的创建细节进行隐藏封装。
在加入新的产品时无须修改抽象工厂和抽象产品提供的接口,只需要增加一个具体工厂和一个具体产品即可,极大的提高了程序的扩展性。
缺点
每个具体产品都需要一个与之对应的具体工厂类,使得系统中类的个数成对增加,增加了系统的复杂度,有更多的类需要编辑和运行,带来了一些额外的开销。