工厂方法设计模式 (Factory Method Pattern)
意图:定义一个创建对象的接口,但让子类决定实例化哪个类。工厂方法使类的实例化延迟到子类。
基础组件
- Product (抽象产品):定义对象的接口
- ConcreteProduct (具体产品):实现 Product 接口
- Creator (创建者):声明工厂方法
- ConcreteCreator (具体创建者):重写工厂方法,返回具体产品
继承/实现关系
Product <|-- ConcreteProduct
Creator <|-- ConcreteCreator
Creator --> Product (工厂方法返回)
应用场景
- 类无法预知需要创建的对象类型
- 希望将对象创建委托给子类
- 需要灵活扩展新产品类型
C++ 实现(图形渲染场景)
#include <iostream>
#include <string>
#include <memory>
/*
* 工厂方法模式
* 意图:定义一个创建对象的接口,但让子类决定实例化哪个类。工厂方法使类的实例化延迟到子类。
* 基础组件:
* - Product (抽象产品):定义对象的接口
* - ConcreteProduct (具体产品):实现 Product 接口
* - Creator (抽象工厂):声明返回 Product 对象的工厂方法
* - ConcreteCreator (具体创建者):重写工厂方法,返回具体产品
* 继承/实现关系:
* ConcreteProduct 实现 Product 接口。
* ConcreteCreator 继承 Creator,并实现工厂方法以返回 ConcreteProduct 实例。
* Creator 定义工厂方法,返回 Product 类型。
*/
// 抽象产品:渲染器接口
class Renderer {
public:
virtual void render() = 0;
virtual ~Renderer() = default;
};
// 具体产品:OpenGL 渲染器
class OpenGLRenderer : public Renderer {
public:
void render() override {
std::cout << "Rendering with OpenGL\n";
}
};
// 具体产品:Vulkan 渲染器
class VulkanRenderer : public Renderer {
public:
void render() override {
std::cout << "Rendering with Vulkan\n";
}
};
// 抽象工厂:渲染器工厂接口
class RendererFactory {
public:
virtual std::unique_ptr<Renderer> createRenderer() = 0;
virtual ~RendererFactory() = default;
};
// 具体工厂:OpenGL 渲染器工厂
class OpenGLFactory : public RendererFactory {
public:
std::unique_ptr<Renderer> createRenderer() override {
return std::make_unique<OpenGLRenderer>();
}
};
// 具体工厂:Vulkan 渲染器工厂
class VulkanFactory : public RendererFactory {
public:
std::unique_ptr<Renderer> createRenderer() override {
return std::make_unique<VulkanRenderer>();
}
};
void FactoryMethodPattern()
{
std::cout << std::string(10, '-') << " Factory Method Pattern " << std::string(10, '-') << std::endl;
std::unique_ptr<RendererFactory> factory = std::make_unique<OpenGLFactory>();
std::unique_ptr<Renderer> render = factory->createRenderer();
render->render();
}
组件对应关系
Renderer→ 抽象产品OpenGLRenderer/VulkanRenderer→ 具体产品RendererFactory→ 创建者OpenGLFactory/VulkanFactory→ 具体创建者
834

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



