• 大话设计模式C++版——简单工厂模式


    简单工厂模式应该是所有设计模式中最简单,也最基础的一种模式,以下是一个简单的采用工厂模式写一个加减法的计算器。


    1、抽象接口类——依赖倒转原则(高层和底层都要依赖于抽象,针对接口编程)

    class IOperation
    {
    public:
    	IOperation() : m_nNuml(0), m_nNumr(0) {}
    	virtual	~IOperation() {}
    	
    	virtual	void	SetNum(int nNuml = 0, int nNumr = 0)
    	{
    		m_nNuml = nNuml;
    		m_nNumr = nNumr;
    	}
    	virtual	int		CalculateResult() = 0;
    	
    protected:
    	int	m_nNuml, m_nNumr;
    };

    注:m_nNuml, m_nNumr申明为protected,是为了让继承类中能够使用,同时又保持其访问的私有性,这和C#是不一样的地方


    2、接口实现对象类——加法、减法类(乘除法就省略了,类似)

    class COperation_Add : public IOperation
    {
    public:
    	int		CalculateResult()
    	{
    		return	m_nNuml + m_nNumr;
    	}
    };
    
    
    class COperation_Dec : public IOperation
    {
    public:
    	int		CalculateResult()
    	{
    		return	m_nNuml - m_nNumr;
    	}
    };


    3、工厂类——生成抽象对象

    <span style="font-size:14px;">class CClassFactory
    {
    public:
    	CClassFactory() {}
    	~CClassFactory() {}
    	
    	IOperation*	CreateObject(char cOperation)
    	{
    		IOperation*	poCOperation = NULL;
    		switch (cOperation)
    		{
    		case '+':
    			{
    				poCOperation = new COperation_Add();
    				break;
    			}
    		case '-':
    			{
    				poCOperation = new	COperation_Dec();
    				break;
    			}
    			break;
    		}
    		
    		return	poCOperation;
    	}
    };


    4、使用工厂生产对象

    void	Test()
    {
    	CClassFactory	oCClassFactory;
    	IOperation*		poIOperation = NULL;
    
    	poIOperation = oCClassFactory.CreateObject('+');
    	
    	if (poIOperation)
    	{
    		poIOperation->SetNum(2, 3);
    		printf("2 + 3 = %d
    ", poIOperation->CalculateResult());
    		
    		delete poIOperation;
    	}
    }


    简单工厂模式的好处在于将具体对象的产生过程进行了封装,用户不需要关系这个对象怎么来的,只需要just use it,同时有了对象工厂这个中间人,可以根据需要替换掉相应的对象,使用更加灵活。但简单工厂模式中,判断该产生何种对象时,采用了switch结构,如果需要改动或者增减对象时,需要改动switch结构的代码,不符合开放—封闭原则,即函数、类不可以修改,只能扩展。如何解决此问题,请看下回分解(大话设计模式C++版——表驱动法改造简单工厂模式)



    本文为博主原创文章,如需转载请说明转至http://www.cnblogs.com/organic/
  • 相关阅读:
    给VPS装桌面
    GIT免密码PUSH
    验证码类
    Url几个常用的函数
    PHP--关于模板的原理和解析
    管理员权限执行批处理和静默执行regsvr32注册
    linux 维护常见场景小命令 (未完待续)
    批处理定时重启print打印服务,解决打印机异常队列堆积
    Linux----LVM扩容磁盘空间
    6、Samba 服务器配置
  • 原文地址:https://www.cnblogs.com/organic/p/5005648.html
Copyright © 2020-2023  润新知