zoukankan      html  css  js  c++  java
  • 大话设计模式C++实现-第1章-简单工厂模式

    一、UML图



    二、包括的角色

    简单工厂模式包括三个角色:

    (1)工厂类Factory:工厂类是用来制造产品的。

    因此,在Factory中有一个用于制造产品的Create函数或者Generate函数之类的函数。这个函数可以依据“标识符”的不同生成不同的ConcreteProduct,当然这些ConcreteProduct都是继承自AbstractProduct的。

    (2)抽象产品类AbstractProduct:抽象产品是从其它详细产品抽象出来的。

    抽象产品类仅仅有一个。

    (3)详细产品类ConcreteProduct:详细产品类继承自抽象产品类,能够有多个。当须要添加新的产品的时候就添加一个继承自抽象产品类的详细产品类就可以。

    三、优势:

    实现了松耦合。当须要添加一种新产品(在大话设计模式中,样例是 运算Operation),仅仅须要做两点修改:

    (1)添加一个继承自抽象产品(抽象的运算)的详细产品(一种详细的运算);

    (2)在工厂类中,switch中,添加一种依据标识符产生新运算的case就可以。

    四、C++实现

    (1)代码

    #include <iostream>
    #include <cstdlib>
    
    using namespace std;
    
    //抽象产品类
    class Operation
    {
    protected:
    	double numberA;
    	double numberB;
    
    public:
    	double getA()
    	{
    		return numberA;
    	}
    	double getB()
    	{
    		return numberB;
    	}
    	void setA(double number)
    	{
    		numberA=number;
    	}
    	void setB(double number)
    	{
    		numberB=number;
    	}
    
    	virtual double GetResult()
    	{
    		double result=0;
    		return result;
    	}
    };
    
    //以下是四种详细产品类
    class OperationAdd:public Operation
    {
    public:
    	double GetResult()
    	{
    		double result=0;
    		result=numberA+numberB;
    		return result;
    	}
    };
    
    class OperationSub:public Operation
    {
    public:
    	double GetResult()
    	{
    		double result=0;
    		result=numberA-numberB;
    		return result;
    	}
    };
    
    class OperationMul:public Operation
    {
    public:
    	double GetResult()
    	{
    		double result=0;
    		result=numberA*numberB;
    		return result;
    	}
    };
    
    class OperationDiv:public Operation
    {
    public:
    	double GetResult()
    	{
    		double result=0;
    		if(numberB!=0)
    			result=numberA/numberB;
    		return result;
    	}
    };
    
    //工厂类	
    class OperationFactory
    {
    public:
    	Operation* createOperation(char type)
    	{
    		Operation* oper;
    		switch(type)
    		{
    		case '+':
    			oper=new OperationAdd;
    			break;
    		case '-':
    			oper=new OperationSub;
    			break;
    		case '*':
    			oper=new OperationMul;
    			break;
    		case '/':
    			oper=new OperationDiv;
    			break;
    		}
    		return oper;
    	}
    };
    
    //client
    void main()
    {
    	Operation* oper=NULL;
    
    	OperationFactory of;
    	oper=of.createOperation('/');
    	oper->setA(1);
    	oper->setB(2);
    	cout<<oper->GetResult()<<endl;
    	if(oper!=NULL)
    	{
    		delete oper;
    		oper=NULL;
    	}
    	system("pause");
    }
    
    (2)执行截图






  • 相关阅读:
    电商总结(六)系统容量预估
    Nginx 和 IIS 实现动静分离
    聊一聊PV和并发
    RabbitMQ学习系列(四): 几种Exchange 模式
    RabbitMQ学习系列(三): C# 如何使用 RabbitMQ
    RabbitMQ学习系列(二): RabbitMQ安装与配置
    RabbitMQ学习系列(一): 介绍
    推荐:《部落 一呼百应的力量》
    Solr学习总结(八)IK 中文分词的配置和使用
    常用的数据统计Sql 总结
  • 原文地址:https://www.cnblogs.com/yxysuanfa/p/6763000.html
Copyright © 2011-2022 走看看