• 设计模式----简单工厂模式


    前段时间比较忙,一直没时间看设计模式,原本计算也被打乱了,只能有空时学习一下,从最简单的简单工厂模式开始吧

    1、什么是简单工厂模式

    简单工厂模式属于创建型模式,是由一个工厂对象决定创建出哪一类产品类的实例,其实质就是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类的实例

    2、实例

    下面的代码功能主要是实现一个工厂类,工厂类根据传入的运算符,创建出相应的加法/减法类实例。

    首先是创建一个父类运算类:运算类只有两个变量numbeA和numberB,同时构造函数初始化变量值,然后就是一个虚函数,后续由子类实现对应的功能。

    //运算类
    class Operation
    {
    
    public:
    	double NumberA;
    	double NumberB;
    	
    	//构造函数,初始化
    	Operation()
    	{
    		NumberA = 2.0;
    		NumberB = 1.0;
    	}
    
    	//虚函数
    	virtual double GetResult()
    	{
    		double result = 0;
    		return result;
    	}
    
    };
    

     然后创建减法类和加法类,继承运算类,实现加法和减法:

    //继承运算类的加法类
    class OperationAdd : public Operation
    {
    	double GetResult()
    	{
    		double result = 0;
    		result = NumberA + NumberB;
    		return result;
    	}
    };
    
    //继承运算类的减法类
    class OperationSub : public Operation
    {
    	double GetResult()
    	{
    		double result = 0;
    		result = NumberA - NumberB;
    		return result;
    	}
    };
    

    最后创建工厂类,完成根据运算符创建对应加法/减法实例

    //生成实例的工厂类
    class OperationFactory
    {
    public:
    	static Operation* CreateOperate(char operate)
    	{
    		Operation * oper = NULL;
    		switch(operate)
    		{
    		case '+':
    			oper = new OperationAdd();
    			break;
    		case '-':
    			oper = new OperationSub();
    		}
    		return oper;
    	}
    };
    

      客户端代码为

    //客户端
    int main()
    {
    	//工厂类对象指针
    	OperationFactory* factoryA = new OperationFactory();
    	
    	double resultAdd = 0;
    	double resultSub = 0;
    	
    	//传入运算符'-'
    	char operate = '-';
    	resultSub = factoryA->CreateOperate(operate)->GetResult();
    	
    	//传入运算符'+'
    	operate = '+';
    	resultAdd = factoryA->CreateOperate(operate)->GetResult();
    	
    	cout << resultAdd << " "<< resultSub <<endl; //结果为3 1
    
    	getchar();
    	return 0;
    }
    

    3、优缺点

    这是一个很好理解的工厂模式实例,工厂模式很好地将业务和界面分离开,如果需要增加其他运算如乘法、除法、开方、平方等运算,只需要增加相应的乘法类、除法类等等,同时在工程类的分支中加入对应类的实例创建分支,对于客户端来讲,业务逻辑是不可见的。但同样也有一定的缺点,由于所有的运算子类实例创建都在一个工厂类中,违背了高内聚原则,如果需要增加其他类,那么必须要改动工厂类的内部实现,并且虽则功能的不断增多,子类增加,判断也增加对系统的维护和扩展不利。

  • 相关阅读:
    TestNG DataProvider的几种方法写法
    ruby操作EXCEL的简单示例
    QTP的tsr对象库文件转换成XML
    Ruby对时间的处理
    java读取YAML文件
    ruby遍历文件夹
    ruby操作excel文件
    [转载]利用ruby的Net::HTTP发起http请求并对返回包进行简单的校验
    QTP连接MySQL (转载)
    Ruby 冒泡排序
  • 原文地址:https://www.cnblogs.com/xqn2017/p/9198824.html
Copyright © 2020-2023  润新知