zoukankan      html  css  js  c++  java
  • 设计模式-工厂方法模式

    工厂方法模式: 

        我对这个的理解是,简单工厂的工厂是生产对象,而工厂方法模式的工厂是生产工厂对象,然后被生产的工厂对象再去生产产品对象,也就是把对象的创建延迟到了工厂创建的工厂里。要理解这个模式就要对比着去看简单工厂,还有就是书上对这个例子描述的不是很透彻,用的例子没说明性,也没过多的阐述这个模式的特点,也就是书上说的不是很透,我看了书然后又在网上查了一些资料,现在我还是用例子说明(我之前的总结有问题,这次重新总结)。
    还是来分析加减乘除的那个问题,简单工厂方法是把算法抽象出来,然后通过工厂直接生产算法类实体,然后客户端得到这个类直接调用。看上去还比较简单,但是问题是不满足OCP啊,就是那个工厂里面的那个Switch(),为了解决掉这个问题,工厂方法是在工厂的地方继续抽象,当新增加一个算法的时候,直接增加一个继承类就行了。这样满足OCP,方便扩展。

    工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。


        简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。而工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单的工厂的内部逻辑哦判断移到了客户端代码来进行,你想要加功能,本来是改工厂类的么人现在是修改客户端!。但是最大的优点就是扩展的时候可以满足OCP了。

    工厂方法模式实现加减乘除

    #pragma once
    //抽象算法接口
    class CInterfaceAlgorithm
    {
    public:
    	virtual bool GetValue(const int &nNumberA ,const int &nNumberB ,int &nNumberAns) = 0;
    };
    
    class CAddition : public CInterfaceAlgorithm
    {
    public:
    	bool GetValue(const int &nNumberA ,const int &nNumberB ,int &nNumberAns)
    	{
    		nNumberAns = nNumberA + nNumberB;
    		return true;
    	}
    };
    
    class CSubtraction : public CInterfaceAlgorithm
    {
    public:
    	bool GetValue(const int &nNumberA ,const int &nNumberB ,int &nNumberAns)
    	{
    		nNumberAns = nNumberA - nNumberB;
    		return true;
    	}
    }; 
    
    class CMultiplication : public CInterfaceAlgorithm
    {
    public:
    	bool GetValue(const int &nNumberA ,const int &nNumberB ,int &nNumberAns)
    	{
    		nNumberAns = nNumberA * nNumberB;
    		return true;
    	}
    }; 
    
    class CDivision : public CInterfaceAlgorithm
    {
    public:
    	bool GetValue(const int &nNumberA ,const int &nNumberB ,int &nNumberAns)
    	{
    		if(!nNumberB)
    		{
    			return false;
    		}
    		nNumberAns = nNumberA / nNumberB;
    		return true;
    	}
    }; 
    
    //工厂接口
    class CInterfaceFactory
    {
    public:
    	virtual CInterfaceAlgorithm * GetFactoryBody() = 0;
    };
    
    class CAdditionFactory : public CInterfaceFactory
    {
    public:
    	CInterfaceAlgorithm * GetFactoryBody()
    	{
    		return new CAddition();
    	}
    };
    
    class CSubtractionFactory : public CInterfaceFactory
    {
    public:
    	CInterfaceAlgorithm * GetFactoryBody()
    	{
    		return new CSubtraction();
    	}
    };
    
    class CMultiplicationFactory : public CInterfaceFactory
    {
    public:
    	CInterfaceAlgorithm * GetFactoryBody()
    	{
    		return new CMultiplication();
    	}
    };
    
    class CDivisionFactory : public CInterfaceFactory
    {
    public:
    	CInterfaceAlgorithm * GetFactoryBody()
    	{
    		return new CDivision();
    	}
    };

    客户端调用

    #include "stdafx.h"
    #include "FactoryMode.h"
    #include <iostream>
    using namespace std;
    
    int main()
    {
    	CInterfaceAlgorithm *pHashMemoryAlgorithm[10] = {0};
    	CInterfaceFactory *pHashMemoryFactory[10] = {0};
    	int nAlgorithmId = -1 ,nFactoryId = -1 ,nAns;
    	
    	pHashMemoryFactory[++nFactoryId] = new CAdditionFactory();
    	pHashMemoryAlgorithm[++nAlgorithmId] = pHashMemoryFactory[nFactoryId]->GetFactoryBody();
    
    	pHashMemoryFactory[++nFactoryId] = new CSubtractionFactory();
    	pHashMemoryAlgorithm[++nAlgorithmId] = pHashMemoryFactory[nFactoryId]->GetFactoryBody();
    
    	pHashMemoryFactory[++nFactoryId] = new CMultiplicationFactory();
    	pHashMemoryAlgorithm[++nAlgorithmId] = pHashMemoryFactory[nFactoryId]->GetFactoryBody();
    
    	pHashMemoryFactory[++nFactoryId] = new CDivisionFactory();
    	pHashMemoryAlgorithm[++nAlgorithmId] = pHashMemoryFactory[nFactoryId]->GetFactoryBody();
    
    	for(int i = 0 ;i <= nAlgorithmId ;i ++)
    	{
    		if( pHashMemoryAlgorithm[i]!= NULL && pHashMemoryAlgorithm[i]->GetValue(1 ,5 ,nAns))
    		{
    			cout<<nAns<<endl;
    		}
    		else 
    		{
    			cout<<"Error"<<endl;
    		}
    	}
    
    	for(int i = 0 ;i <= nAlgorithmId ;i ++)
    	{
    		delete pHashMemoryAlgorithm[i];
    		delete pHashMemoryFactory[i];
    	}
    	return 0;
    }


  • 相关阅读:
    日志记录的作用和方法 java
    log4j自动加载原理
    java反射中的动态代理机制(有实例)
    万能的ctrl+shift+F(Element 'beans' cannot have character [children], because the type's content type is element-only.错误)
    Spring的@ModelAttribute注解
    Spring MVC 的@RequestParam注解和request.getParameter("XXX")
    SpringMVC 示例实战教程
    ecshop教程:重置后台密码MD5+salt
    github常见操作和常见错误!错误提示:fatal: remote origin already exists.
    ECShop函数列表大全
  • 原文地址:https://www.cnblogs.com/csnd/p/12062364.html
Copyright © 2011-2022 走看看