工厂管理-抽象工厂模式 精品

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

题目:抽象工厂模式

学生姓名张婧

学号20XX21077 院系信息科学与技术学院专业计算机应用技术

年级20XX 级

抽象工厂模式

在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时由于需求的变化,往往存在着更多系列对象的创建工作。如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合?这就要用到抽象工厂模式。抽象工厂模式是简单工厂模式和工厂方法模式的升级版,它有更大的灵活性,同时也更加复杂一些。

为了理解抽象工厂,我们考虑这样一个实际例子:如果你想吃饭了,怎么办自己做吗?自己做就相当于程序中直接使用new。当然是自己下个指令,别人来做更爽。那就把做饭的任务交给厨师吧,那么他就是一个做饭的工厂了,你告诉他要吃红烧肉,等会他就从厨房给你端出来一盘香喷喷的红烧肉了,再来个清蒸鱼吧。下图 1 就是这个问题的模型。

图1

显然到了这里,你是Client,厨师就是工厂,他拥有做红烧肉的方法,做清蒸鱼的方法,这些方法返回值就是食物抽象。红烧肉、清蒸鱼就是食物的继承类,简单工厂模式也成型了。

简单工厂模式结构

图2

优点:允许客户端相对独立的创建产品的过程,并且在系统引入新产品的时候无需修改客户端。

缺点:对修改不封闭,新增加产品您要修改工厂。违法了开闭法则(OCP)。

工厂方法模式生活例子:

厨师手艺再好,总有不会做的菜,你想吃回锅肉,怎么办,让厨师学呗,于是就给他新增了做回锅肉的方法,以后你再想吃一个新菜,就要给厨师新加一个方法,显然此做法的缺点也就暴露出来了,用程序设计的描述就是对修改永远不能封闭。

面对上面对修改不能封闭的问题,有没有好的解决方案吗?把厨师抽象变成一个基类,你请几个具体的厨师,分别有做清蒸鱼的,做红烧肉的厨师,如果你想吃一个新菜,就再新找个厨师,从你的厨师基类继承一下,让他来做这个新菜。现在来看这个模式发生了变化,结构中多了一个厨师的抽象,抽象并不具体的加工产品了,至于做什么,是由这个抽象工厂的继承子类来实现,现在的模式也就变成工厂方法模式了,这个上面的结构图1就变成了下面的图3的结构了。

图3

现在再来分析现在的模式,显然简单工厂的缺陷解决了,新增加一个菜只需要新增加一个厨师就行了,原来的厨师还在做原来的工作,这样你的设计就对修改封闭了。

工厂方法模式结构

图4

优点:优化简单工厂模式,做到“开-闭”原则。可做到把具体的产品创建过程延迟到具体的子类工厂。

缺点:对于创建不同系列的产品无能为力。

抽象工厂模式生活例子

你发现菜可分成许多菜系,鲁菜、粤菜、湘菜等等,它们各有各的风味,同样是红烧肉由不同菜系出来的味道也各不相同。如果你的厨师都是鲁菜风味,广东的朋友来了吃不惯,怎么办?

现在我们再回到简单工厂模式,我们把红烧肉再向下继承,生成鲁菜红烧肉、粤菜红烧肉、湘菜红烧肉;清蒸鱼向下继承为鲁菜清蒸鱼、粤菜清蒸鱼、湘菜清蒸鱼。我们也修改一下厨师这个类,不让其返回食物基类,而是返回红烧肉、清蒸鱼、这一层次,并把这些方法抽象化,作为菜系工厂基类,然后再从此基类继承出,鲁菜工厂、粤菜工厂、湘菜工厂等等,再由这些具体工厂实现创建具体菜的工作。

图5

现在可以看到,想新来做一个菜系,只需新聘请一个厨师就可以了,多么完美,但是你先别高兴太早,如果你想新增加一个菜就变得非常困难了。

抽象工厂模式结构

图6

抽象工厂模式代码

#include

#include

using namespace std;

//红烧肉

class CHongshaorou

{

public:

virtual ~CHongshaorou() {};

//产品使用公共接口

virtual void Start() = 0;//抽象基类,纯虚函数由派生类去实现};

//鲁菜红烧肉

class CHongshaorouLucai : public CHongshaorou

{

public:

CHongshaorouLucai()

{

cout << "制作鲁菜红烧肉." << endl;

}

virtual ~CHongshaorouLucai() {};

virtual void Start()

{

cout << "鲁菜红烧肉好了." << endl;

};

};

//粤菜红烧肉

class CHongshaorouYuecai : public CHongshaorou {

public:

CHongshaorouYuecai()

{

cout << "制作粤菜红烧肉." << endl;

}

virtual ~CHongshaorouYuecai() {};

virtual void Start()

{

cout << "粤菜红烧肉好了." << endl;

};

};

//清蒸鱼

class Cqingzhengyu

{

public:

virtual ~Cqingzhengyu() {};

//产品使用公共接口

virtual void Start() = 0;//抽象基类,纯虚函数由派生类去实现};

//鲁菜清蒸鱼

class CqingzhengyuLucai : public Cqingzhengyu

{

public:

CqingzhengyuLucai()

{

cout << "制作鲁菜清蒸鱼." << endl;

}

virtual ~CqingzhengyuLucai() {};

virtual void Start()

{

cout << "鲁菜清蒸鱼好了." << endl;

};

};

//粤菜清蒸鱼

class CqingzhengyuYuecai : public Cqingzhengyu

{

public:

CqingzhengyuYuecai()

{

cout << "制作粤菜清蒸鱼." << endl;

}

virtual ~CqingzhengyuYuecai() {};

virtual void Start()

{

相关文档
最新文档