工厂方法模式是设计模式中的一种创建型模式,它主要解决的问题是对象创建的问题。它定义了一个创建对象的接口,但让实现这个接口的类来决定实例化哪一个类。工厂方法让类的实例化推迟到子类中进行。
工厂方法模式的概念
在工厂方法模式中,我们不再使用单个类来创建所有类型的对象,而是创建一个接口或者抽象类来指定生成对象的方法,然后让子类决定要实例化的类。工厂方法模式允许一个类在不改变其代码的情况下更换对象的类型。
工厂方法模式的优点
- 灵活性高:增加新的具体产品只需增加新的具体工厂,不需要修改原有工厂或其他的具体产品,遵守开闭原则。
- 扩展性强:由于工厂方法是通过在不同的具体工厂中实现不同的业务逻辑来创建不同的产品,这为产品的扩展提供了方便。
- 解耦:客户端不需要知道它所使用的具体产品的类名,只需要知道相应的工厂即可,减少系统的耦合度。
工厂方法模式的缺点
- 类的个数容易增多:每增加一个产品就需要增加一个具体产品类和一个对应的具体工厂类,类的个数将成倍增加,增加了系统的复杂度。
- 增加了系统的抽象性和理解难度:如果没有合理的设计,有时候会使系统变得非常复杂,难以理解和管理。
Java代码示例
假设我们有一个Product
接口和它的一些实现类,我们想要根据不同的条件创建不同的Product
实例。我们可以创建一个Factory
接口和一些实现了这个接口的具体工厂类来实现这一点。
首先是Product
接口及其实现类:
java复制代码
public interface Product {
void use();
}
public class ConcreteProductA implements Product {
@Override
public void use() {
System.out.println("Using ConcreteProductA");
}
}
public class ConcreteProductB implements Product {
@Override
public void use() {
System.out.println("Using ConcreteProductB");
}
}
然后是Factory
接口及其具体实现:
java复制代码
public interface Factory {
Product createProduct();
}
public class ConcreteFactoryA implements Factory {
@Override
public Product createProduct() {
return new ConcreteProductA();
}
}
public class ConcreteFactoryB implements Factory {
@Override
public Product createProduct() {
return new ConcreteProductB();
}
}
使用:
java复制代码
public class FactoryMethodDemo {
public static void main(String[] args) {
Factory factoryA = new ConcreteFactoryA();
Product productA = factoryA.createProduct();
productA.use();
Factory factoryB = new ConcreteFactoryB();
Product productB = factoryB.createProduct();
productB.use();
}
}
这个例子展示了工厂方法模式如何在不直接实例化对象的情况下,通过使用工厂来创建不同的Product
对象。这种方式使得添加新产品类时,只需添加相应的工厂类即可,无需修改现有代码,符合开闭原则。