大话设计模式C++版——工厂方法模式

工厂方法模式是以简单工厂模式为基础的,如果未了解简单工厂模式的同学可先浏览《大话设计模式C++版——简单工厂模式》。在简单工厂模式中,提到过简单工厂模式的缺陷,即违背了开发—封闭原则,其主要原因是由于switch的判断结构的使用,使修改或添加新的对象时需要改动简单工厂类的代码,不符合开放—封闭原则,那么工厂方法模式会在那方面有所改进呢?我们仍以简单工厂模式中加减法计算器为例。

1、保持简单工厂模式的 IOperation 接口和实现对象(COperation_Add 和 COperation_Dec)

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;
};

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;
	}
};

2、和加减法计算器接口类似,将工厂对象也依赖于抽象接口(和简单工厂模式不同之处)

class IOperationFactory
{
public:
	virtual	~IOperationFactory() {}

	virtual	IOperation*	CreateOperation() = 0;
};

class COperationFactory_Add : public	IOperationFactory
{
public:
	IOperation*	CreateOperation()
	{
		return	new	COperation_Add();
	}
};

class COperationFactory_Dec : public	IOperationFactory
{
public:
	IOperation*	CreateOperation()
	{
		return	new	COperation_Dec();
	}
};

工厂接口 IOperationFactory 提供一个生产 IOperation 计算对象的接口,然后不同的工厂对象生产不同IOperation 计算对象(加法工厂 COperationFactory_Add 生产

COperation_Add 对象,减法工厂 COperationFactory_Dec 则生产 COperation_Dec对象),即每一个生产对象对应一个工厂类,一个工厂类只生产一种产品,如五粮液只生产白酒,而青岛啤酒则只生产啤酒。

3、使用工厂方法模式

void	Test()
{
	IOperationFactory*	poIOperationFactory = new COperationFactory_Add();
	IOperation*	poIOperation = NULL;

	if (!poIOperationFactory)
	{
		return;
	}

	poIOperation = poIOperationFactory->CreateOperation();

	if (poIOperation)
	{
	 	poIOperation->SetNum(2, 3);
	 	printf("2 + 3 = %d\n", poIOperation->CalculateResult());

	 	delete poIOperation;
 	}

	delete	poIOperationFactory;
}

工厂方法模式使用和简单工厂模式类似,都是先弄一个工厂对象,然后调用工厂对象接口生产计算器对象,不同的是,简单工厂能根据请求类型生产多种计算器对象,而工厂方法模式的工厂只能是一种,如果要生产其他计算器对象,那就是让五粮液卖啤酒——逼良为娼了,唯一的方法只能是换家工厂来干。

那么问题来了,如果用户要计算乘法了,简单工厂的方式是在简单工厂类中增加一个switch,同时改动用户调用简单工厂接口的符号,即需要改变2处代码,工厂方法模式则需要新增一个生产乘法计算器的工厂类,同时将 poIOperationFactory
改为该工厂new出的对象,即增加一处代码(乘法工厂类),修改一处代码,实际上还是不完全符合开方—封闭原则,但工厂方法模式的改进之处在于,它将简单工厂类修改switch结构的方式改为增加乘法工厂类了,而增加(扩展)是允许的,所以工厂方法模式虽然也要修改代码,但改动减少,这就是工厂方法模式比简单工厂模式的牛X那么一点点的地方。

时间: 2024-08-03 03:08:08

大话设计模式C++版——工厂方法模式的相关文章

大话设计模式-第八章-工厂方法模式

一.UML图 二.包含的角色 (1)抽象工厂 (2)具体工厂 (3)抽象产品 (4)具体产品 三.优势 (1)工厂方法模式是对简单工厂模式的稍微的改进.工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际工作推迟到子类中. (2)与简单工厂模式相比,制造产品的工厂类不再 只有一个,而是每种具体产品类都对应一个生产它的具体工厂类.而这些具体工厂类的共同特征再被提取出来形成一个抽象产品类,这些具体产品类都继承自这个抽象产品类. (3)当需要增加一种产品的时候,需要做的是:增加一种继承自抽象产品

【大话设计模式读书笔记——工厂方法模式】

工厂方法模式 工厂方法模式的实质是"定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类.工厂方法让类的实例化推迟到子类中进行. 工厂方法模式 VS 简单工厂模式 简单工厂的模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择动态的实例化相关的类.对于客户端来说,去除了与具体产品的依赖. 工厂方法模式,定义了一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使得一个类的实例化延迟到其子类.工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题

大话设计模式C++版——工厂模式在COM中的典型应用

上篇<大话设计模式C++版--抽象工厂模式>中,我们拯救世界未遂,留下小小的遗憾,本篇中我们将给出一个解决方案--COM组件技术,同时也顺便扯扯工厂模式在COM组件技术中的应用. 工厂模式违背开放-封闭原则的根本原因在于对象的产生无法通过客户模块外的数据进行控制,如果我们能从xml.注册表.配置文件中写入一个类的名字,然后模块从中读出类名,并根据读出的类名创建对象,那不就和C#高大上的反射技术一样牛B哄哄了.非常幸运,微软的COM组件技术就提供了这么一个平台. 1.COM组件是神马 为了节约篇

设计模式(五)_工厂方法模式

今天主要讲解的是工厂方法模式.内容参考自java_my_life 博主的博客.但是拒绝粘贴复制,全部手打 工厂方法模式是类的创建模式.工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作,推迟到子类中. 案例说明 大家很多时候都做过导出功能,比如一个系统,需要导出的格式包括html.pdf等.但是财务系统导出的格式和其他普通的格式又不一样, 此时如果用我们上篇学到的简单工厂模式,势必会让工厂类很繁琐,各种if判断.日后增加导出的格式,又会对工厂类进行增加逻辑编写. 此时我们采用 工

设计模式学习笔记--工厂方法模式

学习过简单工厂模式,感觉很好用.在创建对象时,可以将复杂的初始化操作从客户端分离出来,简化客户端代码.大大的减少了代码修改的难度.而且可以通过参数不同,创建不同的对象. 但是简单工厂模式也有一些弊端,违背了开放--封闭原则.即如果我们增加了一个产品,对应的工厂也要进行修改,即switch---case中要新增加一些分支条件,不利于扩展.所以就有了下面的工厂方法模式: 工厂方法模式:定义了一个用于创建对象的接口,子类决定实例化哪一个类,工厂方法模式使一个类的实例化延迟到子类. // 设计模式Dem

设计模式C++实现——工厂方法模式

模式定义: 工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个. 工厂方法让类把实例化推迟到子类. 模式结构: Creator是一个类,它实现了全部操纵产品的方法,但不实现工厂方法. Creator的全部子类都必须实现工厂方法(factoryMethod()),以实际制造出产品. 全部的产品必须实现Product基类.这样一来使用这些产品的类就能够引用这个基类,而不是派生类. 举例: 披萨店希望可以开一些加盟店. 经营者希望确保加盟店运营的质量,所以希望这些店都使用能经过实践

23种设计模式[2]:工厂方法模式

一.简单工厂模式(静态工厂方法,不属于23种GOF设计模式之一) 定义:定义一个用于创建产品对象的方法,由该工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例. 类型:创建类模式 public interface SmsService { void sendSms(); } public class MontnetsService implements SmsService { @Override public void sendSms() { Syste

设计模式之:工厂方法模式

模式的定义与特点 工厂方法(FactoryMethod)模式的定义:定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中.这满足创建型模式中所要求的“创建与使用相分离”的特点. 我们把被创建的对象称为“产品”,把创建产品的对象称为“工厂”.如果要创建的产品不多,只要一个工厂类就可以完成,这种模式叫“简单工厂模式”,它不属于 GoF 的 23 种经典设计模式,它的缺点是增加新产品时会违背“开闭原则”. 本节介绍的“工厂方法模式”是对简单工厂模式的进一步抽象化,其好处是可以

设计模式三:工厂方法模式

疑惑解答: 1.interface接口不能够实例化(new),但是可以定义引用来指向继承该接口的实体类: 如: interface animal{ void eat(); } class Cat implements animal{ public void eat(){ System.out.println("The cat eat!"); } } animal an = new Cat(); 一.什么是工厂方法模式 1.是简单工厂模式的进一步抽象: 2.定义一个创建产品对象的工厂接口