设计模式 -- 简单工厂模式 SimpleFactory

引入:

类的创建型模式,一个工厂对象决定应该创建哪一种产品类的实例,这样外界就不用直接创建对象而只要消费对象就可以了,也不必知道这些对象是如何创建如何组织的,这样就明确了各自的职责和权利。有利于软件体系结构的优化和重构。


角色以及指责:

  • 工厂Factory:模式的核心,负责创建各所有实例的内部逻辑,可以被外界调用,创建所需要的产品对象。

  • 抽象产品角色AbstractProduct:工厂所创建的产品对象的父类,提供统一的公共访问接口。

  • 具体产品角色ConcreteProduct:创建的目标,每个对象都是充当这个角色的具体实例


缺点:

由于工厂类集中了所有实例的创建,违反了高内聚的责任分配原则,如果要添加新的类就需要改变工厂。

当具体产品类增多的适合,工厂可能会根据各种不同的要求来创建实例,可能出现各种条件判断创建交织一起,很难避免模块功能的蔓延,不利于系统的维护和扩展。但是在工厂方法模式中得到一定的克服。


使用场景:

  • Factoty负责创建的实例比较少

  • 客户只知道传入工厂的参数,对如何创建的逻辑不关心

  • 一般很少情况下使用,因为违反高内聚的原则

Example:计算器

//  简单工厂模式  实例:计算器
#include <iostream>
#include <cstdlib>
using namespace std;
 
//抽象产品类 -- 运算
class Operation
{
public:
    virtual double getResult()
    {
        double result = 0;
        return result;
    }
 
    double getNumA() const {
        return numA;
    }
 
    void setNumA(double numA) {
        this->numA = numA;
    }
 
    double getNumB() const {
        return numB;
    }
 
    void setNumB(double numB) {
        this->numB = numB;
    }
 
private:
    double numA;
    double numB;
};
 
//产品类  加法
class OperationAdd : public Operation
{
public:
    double getResult()
    {
        double result = 0;
        result = getNumA() + getNumB();
        return result;
    }
};
 
//产品类  减法
class OperationSub : public Operation
{
public:
    double getResult()
    {
        double result = 0;
        result = getNumA() - getNumB();
        return result;
    }
};
 
//产品类  乘法
class OperationMul : public Operation
{
public:
    double getResult()
    {
        double result = 0;
        result = getNumA() * getNumB();
        return result;
    }
};
 
//产品类  除法
class OperationDiv : public Operation
{
public:
    double getResult()
    {
        double result = 0;
        if(getNumB() == 0)
        {
            std::cout << "除数不能为0" << std::endl;
            exit(1);
        }
        result = getNumA() / getNumB();
        return result;
    }
};
 
//新增了运算Pow,A的B次方,只需要增加class OperationPow以及修改Factory即可
class OperationPow : public Operation
{
public:
    double getResult()
    {
        double result = 1;
        for(int i= 0; i<getNumB(); i++)
        {
            result = result * getNumA();
        }
        return result;
    }
};
 
//工厂类,负责创建产品
class OperationFactory
{
public:
    static Operation* createOperation(char opr)
    {
        Operation *pOpr;
        switch(opr)
        {
            case '+':
                pOpr = new OperationAdd();
                break;
            case '-':
                pOpr = new OperationSub();
                break;
            case '*':
                pOpr = new OperationMul();
                break;
            case '/':
                pOpr = new OperationDiv();
                break;
            case 'p':
                pOpr = new OperationPow();
                break;
        }
        return pOpr;
    }
 
};
 
int main() {
    Operation *p;
    p = OperationFactory::createOperation('p');
    p->setNumA(5);
    p->setNumB(3);
    double re = p->getResult();  //125
    std::cout << re << std::endl;
    return 0;
}

小小的计算器完啦!怎样,简单吧。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值