设计模式之抽象工厂

来源:互联网 发布:手机电子屏软件 编辑:程序博客网 时间:2024/04/29 15:27
 

首先非常感谢睡仔:工厂模式,我的所有工厂模式的理解均来自于他的博客思想。

abstractfactory.h

//设计模式之抽象工厂,此方式是在工厂方法的基础上进一步抽象的结果/*理解:世事多变,随着时间的推移,走过的地方越来越多,你天南海北的朋友也越来越多。你发现菜原来还分了许多菜系,鲁菜、粤菜、湘菜等等,它们各有各的风味,同样是红烧肉由不同菜系出来的味道也各不相同, 你招待不同的朋友要用不同的菜系,这下难办了,你的厨师都是鲁菜风味,怎么办,广东的朋友来了吃不惯。现在我们再回到简单工厂模式,我们把红烧肉再向下继承,生成鲁菜红烧肉、粤菜红烧肉、湘菜红烧肉;清蒸鱼向下继承为鲁菜清蒸鱼、粤菜清蒸鱼、湘菜清蒸鱼,其它也以此类推。我们也修改一下老婆的这个类,不让其返回食物基类,而是返回红烧肉、清蒸鱼、爆炒空心菜、西红柿鸡蛋汤这一层次,并把这些方法抽象化,作为菜系工厂基类,然后再从此基类继承出,鲁菜工厂、粤菜工厂、湘菜工厂等等,再由这些具体工厂实现创建具体菜的工作,哈哈你如果招待广东朋友就用粤菜工厂,返回的就是一桌粤菜菜系的红烧肉、清蒸鱼、空心菜和西红柿鸡蛋汤了,你的广东朋友一定会吃的非常合乎胃口了。噢,非常好,你已经实现了抽象工厂模式了。*///定义产品类的基类class product//cookfood{protected://控制不让用户直接实例化product();public:virtual ~product();//virtual void cookingfish() = 0;//做红烧鱼的接口//virtual void cookingbeef() = 0;//做回锅肉的接口virtual void cooking() = 0;//做菜的接口};class cookingfish : public product{public:cookingfish(){}~cookingfish(){}public:virtual void cooking();};class lucaifish : public cookingfish{public:lucaifish(){};~lucaifish(){}public:virtual void cooking();};class chuancaifish : public cookingfish{public:chuancaifish(){}~chuancaifish(){}public:virtual void cooking();};class cookingbeef :public product{public:cookingbeef(){}~cookingbeef(){}public:virtual void cooking();};class lucaibeef:public cookingbeef{public:lucaibeef(){}~lucaibeef(){};public:virtual void cooking();};class chuancaibeef:public cookingbeef{public:chuancaibeef(){}~chuancaibeef(){}public:virtual void cooking();};class abstractfactory{public:abstractfactory(){};virtual ~abstractfactory(){};public:virtual cookingfish* createfish() = 0;//做红烧鱼virtual cookingbeef* createbeef() = 0;//做回锅肉};class concretefactorylucai:public abstractfactory{public:concretefactorylucai(){}~concretefactorylucai(){}public:virtual cookingfish* createfish();virtual cookingbeef* createbeef();};class concretefactorychuancai:public abstractfactory{public:concretefactorychuancai(){}~concretefactorychuancai(){}public:virtual cookingfish* createfish();virtual cookingbeef* createbeef();};


abstractfactory.cpp

#include <stdio.h>#include "abstractfactory.h"product::product(){}product::~product(){}void cookingfish::cooking(){return ;}void lucaifish::cooking(){printf("cooking 鲁菜红烧鱼\n");}void chuancaifish::cooking(){printf("cooking 川菜红烧鱼\n");}void cookingbeef::cooking(){return ;}void lucaibeef::cooking(){printf("cooking 鲁菜回锅肉\n");}void chuancaibeef::cooking(){printf("cooking 川菜回锅肉\n");}cookingfish* concretefactorylucai::createfish(){cookingfish *fish = new lucaifish();return fish;}cookingbeef* concretefactorylucai::createbeef(){cookingbeef *beef = new lucaibeef();return beef ;}cookingfish* concretefactorychuancai::createfish(){cookingfish *fish = new chuancaifish();return fish;}cookingbeef* concretefactorychuancai::createbeef(){cookingbeef *beef = new chuancaibeef();return beef;}int main(){//我想吃鲁菜printf("我想吃鲁菜\n");abstractfactory *absfct = new concretefactorylucai();cookingfish *fish = absfct->createfish();fish->cooking();cookingbeef *beef = absfct->createbeef();beef->cooking();delete fish;delete beef;delete absfct;//我想吃川菜printf("我想吃川菜\n");absfct = new concretefactorychuancai();fish = absfct->createfish();fish->cooking();beef = absfct->createbeef();beef->cooking();delete fish;delete beef;delete absfct;}

本文仅附上程序,理解的重点在simplefactory.h文件,主要看类之间的结构关系

另外,这篇博客介绍的非常好,仅供参考:http://blog.csdn.net/wuzhekai1985/article/details/6660462



 

原创粉丝点击