工厂模式
上一节介绍了简单工厂模式,但是实际上简单工程模式也违反了开闭原则。如果我们有新增的产品,那么就必须在工厂中增加相应的创建代码,后期维护起来比较麻烦(但是也有简单易实现的有点、适合小项目和小Demo)。工厂模式稍微复杂一点,但是解决了这些问题。
定义
定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行。
使用步骤和示例代码
- 定义产品接口(抽象的产品)
public interface Product {
void function();
}
- 定义产品接口的实现类(具体的产品)
//产品A
public class ProductA implements Product {
@Override
public void fucntion() {
System.out.println("A产品的功能执行了");
}
}
//产品B
public class ProductB implements Product {
@Override
public void fucntion() {
System.out.println("B产品的功能执行了");
}
}
- 定义工厂接口(抽象的工厂),在接口中定义创建方法
public interface Factory {
Product createProduct();
}
- 定义接口的实现类(具体的工厂),并实现具体的创建方法
public class ProductAFactory {
@Override
public Product createProduct() {
return new ProductA();
}
}
public class ProductBFactory {
@Override
public Product createProduct() {
return new ProductB();
}
}
在使用的时候,我们使用对应的工厂生产对应的产品。
public class Client {
public static void main(String[] args) {
//A产品
Factory aFactory = new ProductAFactory();
Product a = aFactory.createProduct();
//b产品
Factory bFactory = new ProductBFactory();
Product b = bFactory.createProduct();
}
}
总结
工厂模式相比于简单工厂模式解决了开闭原则的问题,但是也可以看到工厂模式的代码会多一些,每新增加一个具体产类品就要新增加一个对应的工厂。