首页 > 其他分享 >05: 工厂方法模式

05: 工厂方法模式

时间:2024-09-16 16:02:42浏览次数:1  
标签:std CreatOperation 05 模式 工厂 template shared Operation public

1. 案例: 加减乘除运算

2. 工厂方法模式结构

 - 抽象工厂(AbstractFactory): 所有生产具体产品的工厂类的基类,提供工厂类的公共方法

template <typename T>
class OperationFactory
{
public:
    virtual std::shared_ptr<Operation<T>> CreatOperation() = 0;
};

- 具体工厂(ConcreteFactory):生产具体的产品

template <typename T>
class OperationAddFactory :
    public OperationFactory<T>
{
public:
    std::shared_ptr<Operation<T>> CreatOperation() override;
};

template<typename T>
inline std::shared_ptr<Operation<T>> OperationAddFactory<T>::CreatOperation()
{
    return std::make_shared<OperationAdd<T>>();
}
template<class T>
class OperationSubFactory :
    public OperationFactory<T>
{
public:
    std::shared_ptr<Operation<T>> CreatOperation() override;
};

template<class T>
inline std::shared_ptr<Operation<T>> OperationSubFactory<T>::CreatOperation()
{
    return std::make_shared<OperationSub<T>>();
}
template <typename T>
class OperationMulFactory :
    public OperationFactory<T>
{
public:
    std::shared_ptr<Operation<T>> CreatOperation() override;
};

template<typename T>
inline std::shared_ptr<Operation<T>> OperationMulFactory<T>::CreatOperation()
{
    return std::make_shared<OperationMul<T>>();
}
template <typename T>
class OperationDivFactory :
    public OperationFactory<T>
{
public:
    std::shared_ptr<Operation<T>> CreatOperation() override;
};

template<typename T>
inline std::shared_ptr<Operation<T>> OperationDivFactory<T>::CreatOperation()
{
    return std::make_shared<OperationDiv<T>>();
}

- 抽象产品(AbstractProduct):所有产品的基类,提供产品类的公共方法

template <class T>
class Operation
{
public:
    virtual T GetResult() = 0;
    void SetNum(const T& Num1, const T& Num2);
protected:
    T m_Num1;
    T m_Num2;
};

template<class T>
inline void Operation<T>::SetNum(const T& Num1, const T& Num2)
{
    m_Num1 = Num1;
    m_Num2 = Num2;
}

- 具体产品(ConcreteProduct):具体产品类

template <class T>
class OperationAdd :
    public Operation<T>
{
public:
    T GetResult() override;
};

template<class T>
inline T OperationAdd<T>::GetResult()
{
    return Operation<T>::m_Num1 + Operation<T>::m_Num2;
}
template <typename T>
class OperationSub :
    public Operation<T>
{
public:
    T GetResult() override;
};

template<typename T>
inline T OperationSub<T>::GetResult()
{
    return Operation<T>::m_Num1 - Operation<T>::m_Num2;
}
template <typename T>
class OperationMul :public Operation<T>
{
public:
    T GetResult() override;
};

template<typename T>
inline T OperationMul<T>::GetResult()
{
    return Operation<T>::m_Num1 * Operation<T>::m_Num2;
}
template <typename T>
class OperationDiv :
    public Operation<T>
{
public:
    T GetResult() override;
};

template<typename T>
inline T OperationDiv<T>::GetResult()
{
    if (abs(Operation<T>::m_Num2) > 1e-6)
    {
        return Operation<T>::m_Num1 / Operation<T>::m_Num2;
    }
}

3. 用法

    auto spOperationAddFactory = std::make_shared<OperationAddFactory<float>>();
    auto spOperationAdd = spOperationAddFactory->CreatOperation();
    spOperationAdd->SetNum(2, 4);
    std::cout << spOperationAdd->GetResult() << std::endl;

    auto spOperationSubFactory = std::make_shared<OperationSubFactory<float>>();
    auto spOperationSub = spOperationSubFactory->CreatOperation();
    spOperationSub->SetNum(2, 4);
    std::cout << spOperationSub->GetResult() << std::endl;

    auto spOperationMulFactory = std::make_shared<OperationMulFactory<float>>();
    auto spOperationMul = spOperationMulFactory->CreatOperation();
    spOperationMul->SetNum(2, 4);
    std::cout << spOperationMul->GetResult() << std::endl;

    auto spOperationDivFactory = std::make_shared<OperationDivFactory<float>>();
    auto spOperationDiv = spOperationDivFactory->CreatOperation();
    spOperationDiv->SetNum(2, 4);
    std::cout << spOperationDiv->GetResult() << std::endl;

标签:std,CreatOperation,05,模式,工厂,template,shared,Operation,public
From: https://www.cnblogs.com/BoYuCG/p/18416364

相关文章

  • Day15 二叉树part05| LeetCode 654.最大二叉树,617.合并二叉树 ,700.二叉搜索树中的搜索
    654.最大二叉树654.最大二叉树classSolution{publicTreeNodeconstructMaximumBinaryTree(int[]nums){if(nums.length==1)//遍历到了叶子节点{returnnewTreeNode(nums[0]);}intmaxValue=nums[0......
  • 导购APP佣金模式的风险控制与合规性
    导购APP佣金模式的风险控制与合规性大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!随着电商和导购平台的发展,佣金模式已经成为导购APP的重要盈利手段之一。然而,这种模式也带来了不少风险和合规性问题。如果管理不当,不仅会影响用户体验,还可能引......
  • 原型模式(Prototype Pattern)
    原型模式是一种创建型设计模式,使用克隆方法来复制现有对象,从而避免重复的初始化操作,特别适用于创建重复对象的场景。适用场景:当一个系统需要创建新对象的对象系统中,可通过克隆一个原型并对其进行改造。当对象的创建成本比较大(如复杂的初始化)时。示例代码:abstractclassSha......
  • spring mvc详细讲解(前后端分离模式)
    在前后端分离模式下,SpringMVC的作用主要集中在处理后端的业务逻辑和API接口,而不再直接管理视图部分。也就是说,SpringMVC的重点是如何处理客户端的请求并返回数据(通常以JSON或XML格式),而视图渲染交给前端框架(如Vue.js、React等)来完成。下面是针对前后端分离模式的Spri......
  • Unity之单例模式探索
    最近在使用Unity管理远程攻击的时候涉及到了对象池,又因为需要进行脚本之间的通信,而标准通信有略显麻烦,于是使用单例的方式进行脚本之间的伪通信废话不多说,首先登场的就是最为简单的单例实现方法publicclassSingleBase:MonoBehaviour{publicstaticSingleBase......
  • 04: 代理模式
    1.案例:B帮助A追求C2. 代理模式结构 - Subject(抽象主题角色):声明了代理主题角色和真实主题角色共同接口;classGiveGift{public:virtualvoidGiveDolls()=0;virtualvoidGiveFlowers()=0;virtualvoidGiveChocolate()=0;};-RealSubject(......
  • 03: 装饰模式
    1.案例:手机->贴膜->戴保护套->贴卡通贴纸->系手机挂绳2.组合模式和装饰模式组合模式和装饰模式都可以用来透明的把对象包装在具有同样接口的另一个对象中。组合模式和装饰模式都是结构型模式。组合模式着眼于把众多子对象组织为一个整体;装饰模式着眼于在不修改现有对象或从其......
  • 【GESP】C++一级练习BCQM3005,基本输出语句printf
    一道基础练习题,练习基本输出语句printf。BCQM3005题目要求描述输出表达式1234∗5678的结果。输入无输出1234∗5678=7006652输入样例无输出样例1234*5678=7006652全文详见个人独立博客:https://www.coderli.com/gesp-1-bcqm3005/【GESP】C++一级练习B......
  • 02策略模式
    1.案例:营业员根据客户所购买商品的单价和数量,根据不同活动向客户收费**-正常原价收费-八折收费-满300返1002.策略模式结构-抽象策略类(Stategy):声明算法的方法,抽象层的设计使上下文类可以无差别的调用不同的具体策略的方法enumCashType{NORMAL=0,RE......
  • 简单工厂模式
    1.案例:营业员根据客户所购买商品的单价和数量,根据不同活动向客户收费-正常原价收费-八折收费-满300返1002.简单工厂模式结构-抽象产品(AbstractProduct):具体产品类的基类,包含创建产品的公共方法enumCashType{NORMAL=0,REBATE,RETURN};class......