zoukankan      html  css  js  c++  java
  • 设计模式----简单工厂模式

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

    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、优缺点

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

  • 相关阅读:
    maven打包时加入依赖包及加入本地依赖包
    is_file和file_exists效率比较
    window.open()详解及浏览器兼容性问题示例探讨
    Zend Studio汉化失败,如何给Zend Studio进行汉化
    HTML页面跳转的5种方法
    PHP中的符号 ->、=> 和 :: 分别表示什么意思?
    php中$this->是什么意思
    关于define('DISCUZ_ROOT', substr(dirname(__FILE__), 0, -7));的理解
    【精华】PHP网站验证码不显示的终结解决方案
    php提示undefined index的几种解决方法
  • 原文地址:https://www.cnblogs.com/xqn2017/p/9198824.html
Copyright © 2011-2022 走看看