搜狗网站,连云港网站设计,设计类专业就业前景怎么样,长沙本地论坛有哪些前言 模式介绍 在之前简单工厂模式中#xff0c;我们介绍了简单工厂模式的缺陷是违背了开放-封闭原则。如果在面馆中添加了烤海参#xff0c;那将会修改waiter工厂类。违背了类内封闭原则。 还以面馆为例#xff0c;现在两种面#xff0c;用一个服务员来卖就可以#xff0…前言 模式介绍 在之前简单工厂模式中我们介绍了简单工厂模式的缺陷是违背了开放-封闭原则。如果在面馆中添加了烤海参那将会修改waiter工厂类。违背了类内封闭原则。 还以面馆为例现在两种面用一个服务员来卖就可以如果这个服务员不干了后面卖面的厨师需要兼职顶替服务员但是厨师又不能离开灶台就将模式改成了窗口排队式一队海参炒面另一队辣根汤面。每个窗口分别有一个厨师放饭一个会做海参炒面另一个会做辣根汤面。老板觉得这种模式挺好万一来了一个会做烤海参的就只需要开一个烤海参的窗口就好了不需要重新要服务员学习因为烤海参的就会卖。这就变成了工厂模式。 UML类图 这里涉及到2种类①我客户端排队买饭。②做饭厨师类工厂类为我生成饭。③菜品类生成菜品类。具体关系如下UML类图 代码实例 下面是noodle类是为工厂类使用的继承他就可以扩展noodle类别 #ifndef NOODLE_H
#define NOODLE_Hclass noodle
{
public:noodle() {}~noodle() {}virtual void eating() 0;
};#endif // NOODLE_H 下面是海参炒面类继承了noodle实现eating方法吃海参炒面 #ifndef HAISHENNOODLE_H
#define HAISHENNOODLE_H#include noodle.hclass haishennoodle : public noodle
{
public:haishennoodle();~haishennoodle();virtual void eating();
};#endif // HAISHENNOODLE_H #include iostream
#include haishennoodle.hhaishennoodle::haishennoodle()
{}haishennoodle::~haishennoodle()
{}void haishennoodle::eating()
{std::cout 我是海参炒面里面没有海参哦吃的时候注意! std::endl;
} 下面是辣根汤面继承了noodle实现eating方法吃辣根汤面 #ifndef LAGENNOODLE_H
#define LAGENNOODLE_H#include noodle.hclass lagennoodle : public noodle
{
public:lagennoodle();~lagennoodle();virtual void eating();
};#endif // LAGENNOODLE_H #include iostream
#include lagennoodle.hlagennoodle::lagennoodle()
{}lagennoodle::~lagennoodle()
{}void lagennoodle::eating()
{std::cout 我是辣根汤面吃完呛的哼啊 std::endl;
} 下面是waiter工厂的基类。所有工厂都继承这个类 #ifndef WAITER_H
#define WAITER_Hclass noodle;
class waiter
{
public:waiter() {}~waiter() {}virtual noodle *createnoodle() 0;
};#endif // WAITER_H 下面是海参厨师工厂1海参厨师只管做海参炒面重写了createnoodle方法 #ifndef HAISHEN_H
#define HAISHEN_H#include waiter.hclass noodle;
class haishen : public waiter
{
public:haishen();~haishen();virtual noodle *createnoodle();
};#endif // HAISHEN_H #include iostream
#include haishen.h
#include haishennoodle.hhaishen::haishen()
{}haishen::~haishen()
{}noodle *haishen::createnoodle()
{std::cout 面是我炒得我的名字叫海参 std::endl;return new haishennoodle();
} 下面是辣根厨师工厂1辣根厨师只管做辣根汤面重写了createnoodle方法 #ifndef LAGEN_H
#define LAGEN_H#include waiter.hclass lagen : public waiter
{
public:lagen();~lagen();virtual noodle *createnoodle();
};#endif // LAGEN_H #include iostream
#include lagen.h
#include lagennoodle.hlagen::lagen()
{}lagen::~lagen()
{}noodle *lagen::createnoodle()
{std::cout 吃辣根汤面你不觉得呛得哼吗? std::endl;return new lagennoodle();
} 下面是客户端客户端通过类别使用相应的工厂类建立相应的实例 #include iostream
#include string.h#include haishen.h
#include lagen.h
#include noodle.husing namespace std;char *product_list[] {haishen-noodle,lagen-noodle,NULL
};int main()
{char *p NULL;char *pd haishen-noodle;int i 0;waiter *w NULL;noodle *n NULL;for(p product_list[i]; p ! NULL; i, p product_list[i]) {if(strncmp(pd, p, strlen(pd)) 0) {if(i 0) {w new haishen();} else if(i 1) {w new lagen();} else {cout 对不起请您排在队内 std::endl;break;}}}if(w) n w-createnoodle();if(n) n-eating();if(w) {delete w; w NULL;}if(n) {delete n; n NULL;}return 0;
} 下面是CMakeList.txt文件帮助生成Makefile cmake_minimum_required(VERSION 2.8)project(noodle-factory)
set(SRC_LIST main.cpp noodle.h waiter.h haishen.h haishen.cpp haishennoodle.h haishennoodle.cpplagennoodle.h lagennoodle.cpp lagen.h lagen.cpp)
add_executable(${PROJECT_NAME} ${SRC_LIST}) 编译运行结果 代码下载链接是https://github.com/erguangqiang/freesir_headfirst/blob/master/noodle-factory.tar.gz 使用cmake生成Makefile并编译出可执行程序noodle。运行结果如下 erguangqiangelab$./noodle-factory
面是我炒得我的名字叫海参
我是海参炒面里面没有海参哦吃的时候注意 结束 工厂模式解决了简单工厂违背了的开放-封闭原则。虽然累的结构变的复杂了但是对于扩展性得到了很大的提高。 转载于:https://www.cnblogs.com/freeman2012/p/11206166.html