工厂模式是一种典型的创建者模式,当我们需要创建多个相似但是不同的(即都实现一个接口的类)实体类时,我们可以引入工厂类。
工厂模式的引入主要是为了应对需求的变化,主要是基于“在创建一个对象时,需要把容易发生变化的地方给封装起来,来控制变化(哪里变化,封装哪里),以适应客户的变动,项目的扩展 ”的思想。
按照抽象的层次从低到高分别是:简单工厂模式,工厂方法模式和抽象工厂模式。
// 简单工厂模式
class Factory {
public static createProduct(Class<T> clz) {
// 具体的组装逻辑
return Class.forName(clz.getName()).netInstance()
}
}
// 简单工厂模式所有的产品的创建都只有一个工厂
// 它的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例
// 当我们需要扩展其他的产品时,需要在createProduct种增加新的ifelse分支
// 当它需要创建的产品类过多时,会导致createProduct的函数过长
// 工厂方法模式
class abstruct class AbstructFactory {
public abstruct AbstructProduct createProduct();
}
class Factory extends AbstructFactory {
public static createProduct() {
// 具体的组装逻辑
return new ProductA();
}
}
// 工厂方法模式将工厂抽象出一个接口,并通过该接口创建多个工厂,使得工厂和每一个具体产品类一一对应
// 这样我们在增加一个新的产品时,只需要增加一个新的工厂类用于创建它即可,而不用更改原有的代码
// 抽象工厂模式
// 工厂方法模式
class abstruct class AbstructFactory {
public abstruct AbstructProduct createProduct();
}
class Factory1 extends AbstructFactory {
public static createProductA() {
return new ProductA1();
}
public static createProductB() {
return new ProductB1();
}
}
class Factory2 extends AbstructFactory {
public static createProductA() {
return new ProductA2();
}
public static createProductB() {
return new ProductB2();
}
}
// 抽象工厂模式进一步扩展,使得工厂模式可以应付需要产生多个不同抽象产品类的产品时的情况