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

一、UML图

二、包含的角色

(1)抽象工厂

(2)具体工厂

(3)抽象产品

(4)具体产品

三、优势

(1)工厂方法模式是对简单工厂模式的稍微的改进。工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际工作推迟到子类中。

(2)与简单工厂模式相比,制造产品的工厂类不再 只有一个,而是每种具体产品类都对应一个生产它的具体工厂类。而这些具体工厂类的共同特征再被提取出来形成一个抽象产品类,这些具体产品类都继承自这个抽象产品类。

(3)当需要增加一种产品的时候,需要做的是:增加一种继承自抽象产品的具体产品类,增加一种继承在抽象工厂的具体工厂类,更改客户端。而不需要在简单工厂模式中那样更改工厂内的switch。

四、C++实现

(1)计算器的例子

#include <iostream>
#include <cstdlib>

using namespace std;

//抽象产品类
class Operation
{
protected:
	double numberA;
	double numberB;

public:
	double getA()
	{
		return numberA;
	}
	double getB()
	{
		return numberB;
	}
	void setA(double number)
	{
		numberA=number;
	}
	void setB(double number)
	{
		numberB=number;
	}

	virtual double GetResult()
	{
		double result=0;
		return result;
	}
};
//下面是四个具体产品类
class OperationAdd:public Operation
{
public:
	double GetResult()
	{
		double result=0;
		result=numberA+numberB;
		return result;
	}
};

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

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

class OperationDiv:public Operation
{
public:
	double GetResult()
	{
		double result=0;
		if(numberB!=0)
			result=numberA/numberB;
		return result;
	}
};

//抽象工厂类
class AbstractFactory
{
public:
	virtual Operation* createOperation()
	{
		return new Operation;
	}
};
//下面是四个具体工厂类,分别用于产生四个具体产品
class AddFactory:public AbstractFactory
{
public:
	Operation* createOperation()
	{
		Operation* oper=new OperationAdd;
		return oper;
	}
};

class SubFactory:public AbstractFactory
{
public:
	Operation* createOperation()
	{
		Operation* oper=new OperationSub;
		return oper;
	}
};

class MulFactory:public AbstractFactory
{
public:
	Operation* createOperation()
	{
		Operation* oper=new OperationMul;
		return oper;
	}
};

class DivFactory:public AbstractFactory
{
public:
	Operation* createOperation()
	{
		Operation* oper=new OperationDiv;
		return oper;
	}
};

//客户端
void main()
{
	AbstractFactory* af=new AddFactory;
	Operation* oper=af->createOperation();

	oper->setA(1);
	oper->setB(2);
	cout<<oper->GetResult()<<endl;
	system("pause");
}

(2)雷锋工厂的例子

#include <iostream>
#include <cstdlib>

using namespace std;

//抽象产品类:雷锋
class Leifeng
{
public:
	virtual void Sweep()
	{
		cout<<"扫地"<<endl;
	}
	virtual void Wash()
	{
		cout<<"洗衣"<<endl;
	}
	virtual void BuyRice()
	{
		cout<<"买米"<<endl;
	}
};

//下面是两个具体产品类
class Undergraduate:public Leifeng
{
public:
	void Sweep()
	{
		cout<<"学生-扫地"<<endl;
	}
	void Wash()
	{
		cout<<"学生-洗衣"<<endl;
	}
	void BuyRice()
	{
		cout<<"学生-买米"<<endl;
	}
};

class Volunteer:public Leifeng
{
public:
	void Sweep()
	{
		cout<<"志愿者-扫地"<<endl;
	}
	void Wash()
	{
		cout<<"志愿者-洗衣"<<endl;
	}
	void BuyRice()
	{
		cout<<"志愿者-买米"<<endl;
	}
};

//抽象工厂类
class AbstractFactory
{
public:
	virtual Leifeng* CreateLeifeng()
	{
		return new Leifeng;
	}
};

//下面是两个具体工厂类,分别于两个具体产品相对应
class UndergraduateFactory:public AbstractFactory
{
public:
	Undergraduate* CreateLeifeng()
	{
		return new Undergraduate;
	}
};

class VolunteerFactory:public AbstractFactory
{
public:
	Volunteer* CreateLeifeng()
	{
		return new Volunteer();
	}
};

//客户端
void main()
{
	//想要生产Volunteer产品的话,只需要将此处的UndergraduateFactory更改为VolunteerFactory即可。
	AbstractFactory* af=new VolunteerFactory;
	Leifeng* lf=af->CreateLeifeng();

	lf->BuyRice();
	lf->Sweep();
	lf->Wash();

	system("pause");
}
时间: 2024-12-25 23:58:23

大话设计模式-第八章-工厂方法模式的相关文章

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

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

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

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

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

学习过简单工厂模式,感觉很好用.在创建对象时,可以将复杂的初始化操作从客户端分离出来,简化客户端代码.大大的减少了代码修改的难度.而且可以通过参数不同,创建不同的对象. 但是简单工厂模式也有一些弊端,违背了开放--封闭原则.即如果我们增加了一个产品,对应的工厂也要进行修改,即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

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

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

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

模式的定义与特点 工厂方法(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.定义一个创建产品对象的工厂接口

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

在之前提到的简单方法模式中,如果需要给计算器添加一种运算,需要增加一个Operation子类,然后修改工厂类. 这样的设计一方面简化了客户端的修改,另一方面需要修改工厂类,这是违反开放-封闭模式的. 处理这种问题的另一种方法是工厂方法模式. 工厂方法模式克服了违反开放-封闭的缺点,同时保持了封装对象创建过程的优点,但是带来的缺点是,需要新增一个工厂类+修改客户端代码以实现功能扩展. 来看UML图: 四种运算的子类是继承了Operation基类,每个子类都有一个对应的工厂类,封装了创建其实例的过程