工厂模式(工厂方法和抽象工厂)
工厂模式(Factory Pattern)是创建型设计模式之一,旨在提供创建对象的接口,而无需显式指定创建对象的类。这种模式在面向对象编程中非常有用,特别是在需要处理不同类型但实现相似接口的对象时。
工厂模式的核心思想是使用工厂类或方法来封装对象创建的过程,有助于提高代码的灵活性和可维护性。
分类:
简单工厂模式(不是标准的 GoF 设计模式):用于创建对象的简单工厂类,用一个方法根据输入的参数返回特定类型的实例。
工厂方法模式:每个对象都有一个工厂方法接口,通过子类实现不同产品的创建,各子类决定实例化哪种产品。
抽象工厂模式:提供一个接口用于创建一系列相关或相互依赖的对象,无需指定具体类。
#include <iostream>
#include <memory>
// 产品基类
class Product {
public:
virtual void use() const = 0;
virtual ~Product() = default;
};
// 具体产品 A
class ConcreteProductA : public Product {
public:
void use() const override {
std::cout << "Using Concrete Product A" << std::endl;
}
};
// 具体产品 B
class ConcreteProductB : public Product {
public:
void use() const override {
std::cout << "Using Concrete Product B" << std::endl;
}
};
// 工厂基类
class Creator {
public:
virtual std::unique_ptr<Product> factoryMethod() const = 0;
virtual ~Creator() = default;
void someOperation() const {
// 调用工厂方法创建产品对象
std::unique_ptr<Product> product = factoryMethod();
product->use();
}
};
// 具体工厂 A
class ConcreteCreatorA : public Creator {
public:
std::unique_ptr<Product> factoryMethod() const override {
return std::make_unique<ConcreteProductA>();
}
};
// 具体工厂 B
class ConcreteCreatorB : public Creator {
public:
std::unique_ptr<Product> factoryMethod() const override {
return std::make_unique<ConcreteProductB>();
}
};
int main() {
std::unique_ptr<Creator> creatorA = std::make_unique<ConcreteCreatorA>();
creatorA->someOperation();
std::unique_ptr<Creator> creatorB = std::make_unique<ConcreteCreatorB>();
creatorB->someOperation();
return 0;
}
特点
-
解耦创建和使用:客户端不需要知道具体类名,只需要对应的工厂对象(接口),减少耦合。
-
扩展性强:当增加新产品时,只需添加新的工厂类及产品类即可,而不需要修改现有代码,遵循了开放/封闭原则。
-
易于管理复杂对象创建逻辑:提供一种创建对象的集中管理方式,可以在工厂中插入各种逻辑(如缓存、日志、安全验证等)。
场景
-
对象创建的逻辑复杂:当对象的创建过程较复杂且需要许多条件或参数时,工厂模式更能解决问题。
-
系统不希望依赖具体类:如果您希望系统独立于它创建的对象的实现,以支持创建不同对象的可能。
-
需要创建多个相关产品对象:采用抽象工厂模式来处理,这些对象可能必须共同使用。
工厂模式是权衡灵活性和可维护性的一种优雅设计方案,适用于许多面向对象软件开发的场景。

被折叠的 条评论
为什么被折叠?



