zoukankan      html  css  js  c++  java
  • 大话设计模式--工厂模式 factory -- C++实现实例

    实现《大话设计模式》的C++版本。。。

    1. 工厂模式 使用的范围是 同一个基类,下面很多子类。

    (1)这里很容易出现的一个问题n多的子类继承自抽象基类,我们不得不在每次要用到子类的地方就编写诸如new ×××;的代码。这里带来两个问题1)客户程序员必须知道实际子类的名称(当系统复杂后,命名将是一个很不好处理的问题,为了处理可能的名字冲突,有的命名可能并不是具有很好的可读性和可记忆性,就姑且不论不同程序员千奇百怪的个人偏好了。),2)程序的扩展性和维护变得越来越困难。

    (2)还有一种情况就是在父类中并不知道具体要实例化哪一个具体的子类。这里的意思为:假设我们在类A中要使用到类B,B是一个抽象父类,在A中并不知道具体要实例化那一个B的子类,但是在类A的子类D中是可以知道的。在A中我们没有办法直接使用类似于new ×××的语句,因为根本就不知道×××是什么。

    注意: 如下的结构图, 假设还要添加一个算法, 则需要多实现一个算法类, 并且修改简单工厂类的case,这违反 “开放--封闭”原则, 对扩展开放,对修改封闭。。。

    这是工厂模式的缺点,后文有工厂方法模式的比较。。

    下面为(1)的示例:一个关于计算器的设计, 设计有 “+ - * /”等运算,基类 operation , 下面有“+ - * /”的实现子类。

    operation.h

    #ifndef OPERATION_H
    #define OPERATION_H
    
    class operation
    {
    public:
        operation();
        double virtual getResult();
    
        double strA;
        double strB;
        double result;
    };
    
    #endif // OPERATION_H
    

    operation.cpp

    #include "operation.h"
    
    operation::operation()
    {
        strA = 0;
        strB = 0;
        result = 0;
    }
    
    double operation::getResult()
    {
        return result;
    }
    

    operationFunc.h

    #ifndef OPERATIONFUNC_H
    #define OPERATIONFUNC_H
    
    #include "operation.h"
    
    class OperationAdd : public operation
    {
    public:
        double getResult();
    };
    
    class OperationSub : public operation
    {
    public:
        double getResult();
    };
    
    class OperationMul : public operation
    {
    public:
        double getResult();
    };
    
    class OperationDiv : public operation
    {
    public:
        double getResult();
    };
    
    
    #endif // OPERATIONFUNC_H
    

    operationFunc.cpp

    #include "operationFunc.h"
    
    double OperationAdd::getResult()
    {
        result = strA + strB;
        return result;
    }
    
    double OperationSub::getResult()
    {
        result = strA - strB;
        return result;
    }
    
    double OperationMul::getResult()
    {
        result = strA * strB;
        return result;
    }
    
    double OperationDiv::getResult()
    {
        result = strA / strB;
        return result;
    }
    



    operationfactory.h

    #ifndef OPERATIONFACTORY_H
    #define OPERATIONFACTORY_H
    
    #include <string>
    #include "operation.h"
    #include "operationFunc.h"
    using namespace std;
    
    class OperationFactory
    {
    public:
        OperationFactory();
        operation* createOperation(string operStr);
    };
    
    #endif // OPERATIONFACTORY_H
    

    operationfactory.cpp

    #include "operationfactory.h"
    
    OperationFactory::OperationFactory()
    {
    }
    
    operation* OperationFactory::createOperation(string operStr)
    {
        operation *oper = NULL;
    
        if( operStr == "+" )
            oper = new OperationAdd();
        else if( operStr == "-" )
            oper = new OperationSub();
        else if( operStr == "*" )
            oper = new OperationMul();
        else if( operStr == "/" )
            oper = new OperationDiv();
    
        return oper;
    }
    

    main.cpp

    #include <iostream>
    #include <string>
    #include "operationfactory.h"
    
    using namespace std;
    
    int main()
    {
        cout << "Simple Factory test" << endl;
    
        operation *oper = NULL;
        OperationFactory factory;
        oper = factory.createOperation("/");
        oper->strA = 1.1;
        oper->strB = 2.2;
        double result = oper->getResult();
        cout  << "result: " << result << endl;
    
        return 0;
    }
    



     

  • 相关阅读:
    MVC3基础嵌套总结
    List之Union(),Intersect(),Except() 亦可以说是数学中的并集,交集,差集
    sqlserver查询记录数某个区间内记录
    各语言的unix时间戳 【转】
    SQLserver删除某数据库中所有表
    C#日期格式转换大全
    【转】Linq之动态排序(字符传入)
    谈谈Equals和GetHashcode
    JS常用代码收集
    ROW_NUMBER()、RANK()、DENSE_RANK()、NTILE(N)
  • 原文地址:https://www.cnblogs.com/xj626852095/p/3648201.html
Copyright © 2011-2022 走看看