第八章 雷锋依然在人间-工厂方法模式(读书笔记)

 雷锋依然在人间-工厂方法模式

1.简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。
2.工厂方法模式(Factory Method)定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到子类。
3.工厂方法模式的好处就是在扩展功能的时候,只要扩展了变化,不用修改现有的类了,也就完全符合了开放-封闭原则。
4.工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。你想要加功能,搬来是改工厂类的,而现在是修改客户端。
5.工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。但缺点是由于每加一个产品,就需要加一个产品工厂的类,增加了额外的开发量。
6.老人不需要知道谁来做好事,他只需知道是学雷锋的人来帮忙就可以了。

8.1  Operation.h

#pragma once

class Operation
{
public:
	Operation()
		:m_numberA(0),m_numberB(0)
	{
	};
	Operation(double numberA, double numberB)
		:m_numberA(numberA),m_numberB(m_numberB)
	{
	};
	double getA()
	{
		return m_numberA;
	};
	void setA(double number)
	{
		m_numberA = number;
	};

	double getB()
	{
		return m_numberB;
	};
	void setB(double number)
	{
		m_numberB = number;
	};

	virtual double GetResult()
	{
		return 0;
	}
protected:
	double m_numberA;
	double m_numberB;
};

class OperationAdd :public Operation
{
public:
	double GetResult()
	{
		double result = 0;
		result = m_numberA + m_numberB;
		return result;
	}
};

class OperationSub :public Operation
{
public:
	double GetResult()
	{
		double result = 0;
		result = m_numberA - m_numberB;
		return result;
	}
};

class OperationMul :public Operation
{
public:
	double GetResult()
	{
		double result = 0;
		result = m_numberA * m_numberB;
		return result;
	}
};

class OperationDiv :public Operation
{
public:
	double GetResult()
	{
		double result = 0;
		if ( m_numberB == 0 )
			throw "被除数不能为零";
		result = m_numberA / m_numberB;
		return result;
	}
};

8.2  IFactory.h

#pragma once 
#include "Operation.h"

class IFactory
{
public:
	virtual Operation* CreateOperation(void) = 0;
};

//加法工厂
class AddFactory :public IFactory
{
public:
	Operation* CreateOperation(void)
	{
		return new OperationAdd();
	};
};

//减法工厂
class SubFactory :public IFactory
{
public:
	Operation* CreateOperation(void)
	{
		return new OperationSub();
	};
};

//乘法工厂
class MulFactory :public IFactory
{
public:
	Operation* CreateOperation(void)
	{
		return new OperationMul();
	};
};

//除法工厂
class DivFactory :public IFactory
{
public:
	Operation* CreateOperation(void)
	{
		return new OperationDiv();
	};
};

8.3  客户端

#include "stdafx.h"
#include "IFactory.h"

int _tmain(int argc, _TCHAR* argv[])
{
	IFactory* operFactory = new AddFactory();
	Operation* oper = operFactory->CreateOperation();

	oper->setA(1);
	oper->setB(2);
	double result = oper->GetResult();

	delete operFactory;
	delete oper;
	return 0;
}




 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击的横打

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值