03 简单工厂模式

1. 基础介绍

所谓简单工厂模式,是一种实例化对象的方式,只要输入需要实例化对象的名字,就可以通过工厂对象的相应工厂函数来制造你需要的对象。

简单工厂模式的核心是,对于一个父类的多个继承子类,工厂对象的工厂函数根据用户输入,自动new出一个子类对象并返回其父类的指针,这样利用父类的指针执行父类的虚函数,就可以动态绑定子类的重写函数,从而实现多态。

对于一个只拥有加减乘除运算的简单计算器,我们设计一个Operation的父类,并构造加减乘除四个类继承父类重写运算函数GetResult。然后定义工厂类中的工厂函数,其根据用户的输入new出相应的对象实例并返回其父类的指针。

在这里插入图片描述

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include  <tr1/memory>

using namespace std;

class Operation
{
    private:
        double A, B;
    public:
        double GetA() const {return A;}
        double GetB() const {return B;}
        void SetA(double x) {A=x;}
        void SetB(double y) {B=y;}
        double virtual GetResult(){return 0;}
        Operation():A(0), B(0){}
};

class Add : public Operation
{
    public:
        double GetResult()
        {
            return GetA()+GetB();
        }
};

class Sub : public Operation
{
    public:
        double GetResult()
        {
            return GetA()-GetB();
        }
};

class Mul : public Operation
{
    public:
        double GetResult()
        {
            return GetA()*GetB();
        }
};

class Div : public Operation
{
    public:
        double GetResult()
        {
            return GetA()/GetB();
        }
};

class SimpleFactory
{
    public:
        static Operation * CreateOpeartor(char ch)
        {
            Operation * p;
            switch(ch)
            {
                case '+':
                    p = new Add();
                    break;
                case '-':
                    p = new Sub();
                    break;
                case '*':
                    p = new Mul();
                    break;
                case '/':
                    p = new Div();
                    break;
            }
            return p;
        }
};

int main(int argc, char *argv[])
{
    double A = 0;
    double B = 0;
    char ch = '\0';
    cin>>A>>ch>>B;

    tr1::shared_ptr<Operation> op(SimpleFactory::CreateOpeartor(ch));
    op->SetA(A);
    op->SetB(B);
    cout<<op->GetResult()<<endl;
}

转载自:http://www.cnblogs.com/jostree/p/4251756.html

2. 使用总结

3. 使用场景

4. 优点

5. 缺点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值