概述
工厂方法模式是一种广泛应用于面向对象编程中的设计模式,属于创建型模式的一种。该模式的核心在于定义一个用于创建对象的接口,但让子类去决定具体实例化哪一个类。这种设计使得对象的创建过程更加灵活,易于扩展,同时遵循了软件工程中的“开放封闭原则”——即对扩展开放,对修改封闭。
基本结构
产品接口(Product Interface):定义了一个产品的接口,具体产品需要实现这个接口。
具体产品(Concrete Product):实现了产品接口的具体类,不同的具体产品代表了不同的产品对象。
工厂接口(Factory Interface):声明了一个用于创建产品的工厂方法,返回类型为产品接口。
具体工厂(Concrete Factory):实现了工厂接口,负责实例化具体产品对象,每个具体工厂通常只生产一种具体产品。
工作原理
客户端不直接调用new操作来实例化对象,而是通过调用工厂方法来创建对象。这样做的好处在于,如果需要引入新的产品种类,只需增加一个新的具体产品类和对应的具体工厂类即可,无需修改现有代码,提高了系统的可维护性和扩展性。
优点
封装性好:客户端无需知道产品的具体创建细节,只需要知道产品的接口。
扩展性强:新增产品时,只需要添加相应的产品类和工厂类,原有代码无需修改。
遵循开闭原则:对扩展开放,对修改封闭,增加了系统的灵活性和可维护性。
缺点
类的膨胀:随着产品类的增多,需要对应的工厂类也随之增加,这可能导致系统中类的数量急剧上升。
抽象层次提升:引入抽象工厂和产品接口增加了系统的抽象层次,对于一些小型项目可能显得过于复杂。
应用场景
当一个系统需要动态决定创建哪种产品类的实例时。
当一个类无法预料要创建哪种类的对象,或者需要由子类来指定创建的对象时。
当一个类希望由它的子类来指定它所创建的对象时。
示例代码(Java)
// 产品接口
interface Product {
void operation();
}
// 具体产品A
class ConcreteProductA implements Product {
@Override
public void operation() {
System.out.println("ConcreteProductA的操作");
}
}
// 具体产品B
class ConcreteProductB implements Product {
@Override
public void operation() {
System.out.println("ConcreteProductB的操作");
}
}
// 工厂接口
interface Factory {
Product createProduct();
}
// 具体工厂A
class ConcreteFactoryA implements Factory {
@Override
public Product createProduct() {
return new ConcreteProductA();
}
}
// 具体工厂B
class ConcreteFactoryB implements Factory {
@Override
public Product createProduct() {
return new ConcreteProductB();
}
}
// 客户端代码
public class Client {
public static void main(String[ ] args) {
Factory factoryA = new ConcreteFactoryA();
Product productA = factoryA.createProduct();
productA.operation(); // 输出: ConcreteProductA的操作
Factory factoryB = new ConcreteFactoryB();
Product productB = factoryB.createProduct();
productB.operation(); // 输出: ConcreteProductB的操作
}
}
通过上述示例,可以看到工厂方法模式如何解耦了对象的创建过程,使得系统更易于维护和扩展。
评论区