悠悠楠杉
C++工厂模式实践:简单工厂方法的设计艺术
引言:解耦的艺术
在软件工程领域,工厂模式如同一位技艺精湛的工匠,将对象的创建与使用过程优雅分离。C++作为一门兼具高性能与抽象能力的语言,其实现工厂模式的方式尤其值得深入探讨。本文将聚焦简单工厂方法,通过一个完整的文本处理案例,揭示其背后的设计哲学。
简单工厂模式核心思想
基本概念
简单工厂模式(Simple Factory)通过引入专门的工厂类,将对象实例化的职责从客户端代码中抽离。这种模式虽然不在GoF 23种设计模式之列,却是理解工厂系列模式的重要基础。
cpp
class DocumentParserFactory {
public:
static DocumentParser* createParser(const string& type) {
if (type == "markdown") return new MarkdownParser();
if (type == "html") return new HtmlParser();
if (type == "plaintext") return new PlaintextParser();
throw std::runtime_error("Unsupported format");
}
};
优势分析
- 封装变化点:当新增解析器类型时,只需修改工厂类
- 降低耦合:客户端只需知道抽象接口,无需了解具体实现类
- 统一管理:创建逻辑集中在单一位置,便于维护
完整实现案例
抽象产品定义
首先定义所有解析器的共同接口:
cpp
class DocumentParser {
public:
virtual ~DocumentParser() = default;
virtual void parse(const string& content) = 0;
virtual string getTitle() const = 0;
virtual vector<string> getKeywords() const = 0;
};
具体产品实现
实现三种不同的文档解析器:
cpp
class MarkdownParser : public DocumentParser {
public:
void parse(const string& content) override {
// 解析Markdown特有语法
cout << "Processing markdown headers" << endl;
}
//...其他接口实现
};
class HtmlParser : public DocumentParser {
// 实现HTML解析逻辑
};
class PlaintextParser : public DocumentParser {
// 实现纯文本解析逻辑
};
工厂类优化
通过注册机制增强扩展性:
cpp
class ParserFactory {
private:
static map<string, function<DocumentParser()>> registry;
public:
static void registerParser(const string& type,
function<DocumentParser()> creator) {
registry[type] = creator;
}
static DocumentParser* create(const string& type) {
auto it = registry.find(type);
if (it != registry.end())
return it->second();
throw invalid_argument("Unknown parser type");
}
};
// 初始化静态成员
map<string, function<DocumentParser*()>> ParserFactory::registry;
实际应用场景
客户端调用示例
cpp
// 注册解析器
ParserFactory::registerParser("markdown",
// 使用工厂
auto parser = ParserFactory::create("markdown");
parser->parse("# Factory Pattern");
cout << parser->getTitle() << endl;
性能优化技巧
- 使用对象池管理解析器实例
- 引入缓存的flyweight模式
- 通过move语义优化字符串处理
模式演进方向
当简单工厂难以满足需求时,可以考虑:
1. 工厂方法模式:将创建延迟到子类
2. 抽象工厂模式:创建产品家族
3. 建造者模式:复杂对象的逐步构建