工厂方法设计模式(Factory Method Pattern)

工厂方法设计模式 (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 → 具体创建者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值