C++设计模式之简单工厂模式

来源:互联网 发布:putty上传文件到linux 编辑:程序博客网 时间:2024/05/29 03:34

设计模式一共分为三类:创建型模式、结构型模式、行为型模式

创建型模式:因为对象的创建会消耗系统的很多资源,所以单独对对象的创建进行研究从而能够高效地创建对象

包含:简单工厂模式(Simple Factory)、工厂方法模式(Factory Method),抽象工厂模式(Abstract Factory)、建造者模式(Builder)、原型模式(Prototype)、单例模式(Singleton)

结构型模式:在解决了对象的创建问题之后,对象的组成以及对象的依赖关系就成了开发人员关注的焦点

包含:外观模式(Facade)、适配器模式(Adapter)、代理模式(Proxy)、装饰模式(Decorator)、桥接模式(Bridge)、组合模式(Composite)、享元模式(Flyweight)

行为型模式:在对象的创建和结构问题都解决以后,就剩下对象的行为问题了。如果对象的行为设计的好,那么对象的行为就会更清晰,它们之间的协作率也就越高

包含:模板方法模式(Template Method)、观察者模式(Observer)、状态模式(State)、策略模式(Strategy)、职责链模式(Chain of Responsibility)、命令模式(Command)、访问者模式(Visitor)、中介者模式(Mediator)、备忘录模式(Memento)、迭代器模式(Iterator)、解释器模式(Interpreter)

GOF四人帮将设计模式分为23种,简单工厂模式并不包含在内,但是个人觉得简单工厂也很重要,所以这里主要介绍一下简单工厂模式(Simple Factory)

定义:专门创建一个工厂类,这个类根据传进不同的参数,来创建不同的实例,被创建的实例都会有一个抽象的父类

使用时机:简单工厂适合要创建的实例比较少且不是很复杂的情况

优点:客户端不用考虑具体创建哪一个实例,减轻了客户端的负担,提高了效率

缺点:当要创建的实例很多时会特别麻烦,当工厂越来越大时,不利于以后的维护工作

例子:这里的例子盗用一下大话设计模式中简单工厂的例子。实现一个加减乘除的算法,控制台中输入两个数,和计算符号,最后输出结果。

#include<iostream>using namespace std;class Operation{public:virtual double getResult(){double result = 0;return result;}void setNumberA(int a){NumberA = a;}int getNumberA(){return NumberA;}void setNumberB(int b){NumberB = b;}int getNumberB(){return NumberB;}private:int NumberA;int NumberB;};//加法类,执行加法运算class AddOperation:public Operation{public:double getResult(){double sum = 0;sum = Operation::getNumberA() + Operation::getNumberB();return sum;}};//减法类,执行减法运算class SubOperation :public Operation{public:double getResult(){double sum = Operation::getNumberA() - Operation::getNumberB();return sum;}};class MulOperation :public Operation{public:double getResult(){double sum = Operation::getNumberA() * Operation::getNumberB();return sum;}};class DivOperation :public Operation{public:double getResult(){if (Operation::getNumberB() == 0){cout << "除数为0,返回0" << endl;return 0;}double result = Operation::getNumberA()*1.0 / Operation::getNumberB();return result;}};//现在工厂来了,它就根据传来的+、-、*、/四种符号判断应该创建哪一种实例class Factory{public:Operation* getOperation(char s){Operation* oper = nullptr;switch (s){case '+':oper = new AddOperation(); break;case '-':oper = new SubOperation(); break;case '*':oper = new MulOperation(); break;case '/':oper = new DivOperation(); break;}return oper;}};int main(void){Factory* factory = new Factory();Operation* oper = factory->getOperation('+');oper->setNumberA(20);oper->setNumberB(5);cout << oper->getResult() << endl;return 0;}
这样就简单实现了一个简单工厂的例子,可以看出简单工厂主要包含的类有工厂类,抽象产品类和具体产品类!


原创粉丝点击