菜鸟学习设计模式之路——简单工厂模式

简单工厂模式,简单的理解就是创建一个工厂,工厂里存放着各种各样的算法类。以计算器为例,我们创建的就是一个工厂类。工厂类的作用就是创建不同的对象,换句话说,就是将各种计算方法封装。

       接下来,我们用简单工厂模式开始写一个计算器。

1、            创建方法

class method{

public:

        int num_one;

        int num_two;

        method(){};

        virtual int type() = 0;

        ~method(){};

};

这是一个总的方法,这里有一点需要注意的就是virtual int type() = 0;这是一个纯虚函数。一开始,我只将它定义为虚函数,编译就出现问题,改成纯虚函数之后编译就通过了。为什么呢?经过我的反复实践,原因是虚函数也是要进行定义实例化的,不能将它放在那儿不管。纯虚函数就可以。

写完总方法之后,就是将各种运算方法继承总方法就行了,如下:

class methodplus:public method{

        int type(){

                int plus = 0;

                plus = num_one+num_two;

                return plus;

        }

};

class methodminus:public method{

        int type(){

                int minus = 0;

                minus = num_one-num_two;

                return minus;

        }

};

这里为了体现工厂的作用,我特地定义了两个运算,当然有兴趣的同学再多加几种运算也可以,这就是工厂的强大之处。运算类的主要作用就是将virtual int type() = 0;实例化。

2、            创建工厂

class factory{

public:

        method* MethPl;

        method* createobject(const char *target);

        factory(){};

        ~factory(){};

        static factory& GetFactory();

};

工厂类里面比较重要的就是method* createobject(const char *target);和static factory& GetFactory();前者根据传进来的参数来确定应该创建哪一种运算,后者实现封装,提供接口的功能。

工厂创建对象的方法,如下:

method* factory::createobject(const char *target){

        if(NULL==target){

                return NULL;

        }

        if(0==strcmp("+",target)){

                MethPl = new methodplus();

                printf("create success\n");

                return MethPl;

        }

        if(0==strcmp("-",target)){

                 …

这里的代码虽然不完整,但是足够说明工厂创建对象的方法了

3、            编写接口

将封装进行到底的结果就是只剩下一堆接口,下面我们将工厂创建对象等一系列操作进行封装,如下:

factory& factory::GetFactory(){

        static factory dreamfactory;

        return dreamfactory;

}

method* operation(const char *target){

        return factory::GetFactory().createobject(target);

}

4、            主程序

菜鸟的思维就是总觉得不懂的知识非常的牛。刚开始,本菜鸟以为简单工厂模式相当的高明,于是,就忘了在主程序里面定义指向运算的指针,结果并没有预期的好。于是,本菜鸟就想了,虽然工厂很厉害,但要是没有指针指向那个对象,我又怎么能使用创建的对象呢?于是,就豁然开朗了,乖乖的在主程序里面定义了一个指针,结果显然——成功了,如下:

#include "factory.h"

#include <stdio.h>

int main()

{

        int one = 0,two = 0,num = 0;

        char type[2] = {};

        printf("input two numbers:\n");

        scanf("%d%d",&one,&two);

        printf("input the type:\n");

        scanf("%s",&type);

        method *test = NULL;

        test = operation(type);

        test->num_one = one;

        test->num_two = two;

        num = test->type();

        printf("num = %d\n",num);

        return 0;

}

细心的鸟儿就会批评本菜鸟了:没有对参数做错误检查!代码难看!!命名不地道!!!没有做异常处理!!!!咆哮体直接打击到了本菜鸟的自信心。

 

5、            总结:

    从以上4步骤,我们实现了简单工厂模式的设计思想。工厂的作用就在于,你需要什么样的产品(运算方式),我就给你创建什么样的产品,不痛不痒(无需修改以前的代码,只需要在头文件添加相应的继承类)。这个也体现了C++的封装思想。使用时,只要调用接口就可以了。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值