您好,欢迎访问三七文档
面向对象编程技术课程设计实验报告专业:网络工程班级:网113学号:姓名:设计时间:2012年12月(1)应用程序名称:水果生产工厂(2)应用程序主体:应用程序里有一个抽象的水果基类(Fruit)和抽象的工厂基类(Factory)。而各种具体的水果公有继承了水果基类,如Apple,Banana......,而具体工厂(ConcreteFactory)公有继承了工厂基类,用于实例化各种水果派生类。另外,该程序包括基本的选择界面。设计目的:为了把类的实例化延迟到子类,由客户决定究竟实例化哪一个类。(3)应用程序简介:功能介绍:本程序会有一个选择界面,来供客户选择生产哪种水果。并且向客户展示以后如何调用该水果对象。并且本程序通过Singleton模式保证只实例化唯一一个水果生产工厂。基本内容:本程序有如下几个水果类:Apple,Banana,Pear,Peach,Strawberry,这些都是Fruit的公有派生类。每个水果类的show()函数里面都会输出属于自己水果的一句话。如Apple会输出:Anappleadaykeepsthedoctoraway。每种水果都有自己的颜色,含水量,含糖量。而水果工厂通过Fruit*CreateFruit(intchoice)函数来实例化各种水果类。主要技术:Factory模式、Singleton模式因为Factory是抽象基类,而该抽象基类内有纯虚函数Fruit*CreateFruit(intchoice),并且由该基类派生出了一个水果工厂(ConcreteFactory),该水果工厂给出了Fruit*CreateFruit(intchoice)的实现方式,即实例化各种水果类。并且基类里由staticFactory*Instance();和staticFactory*_instance;来实现Sinleton模式来保证只实例化一个水果生产工厂。所以可以用Factory*fac=newConcreteFactory();定义一个指针,申请一段内存空间,为以后调用Fruit*CreateFruit(intchoice)做准备。当客户选择好生产哪一种水果时,如客户选择苹果,苹果用1表示。既可以用这句话来实例化一个苹果类:Fruit*A=fac-CreateFruit(1);,这样就把类的实例化推迟到子类了。虽然指针是Fruit型,但通过把基类的相关函数设为虚函数,即可通过该指针访问派生类的相关函数。我的程序是以show()函数为例。这即为多态性。运行环境:VC6.0主要运行界面:总体设计结构图Factory------------------------------------_instance:Factory*-----------------------------------+abstratCreateFruit():Factory*static+Instance():Factory*Fruit------------------------------------------------------color[20]:char-water:double-sweet:double-----------------------------------------------------+abstrat,constshow():voidConcreteFactory------------------------------------------------------------------------------------+CreateFruit():Factory*Apple----------------------------color[20]:char-water:double-sweet:double---------------------------+show():voidPear-----------------------color[20]:char-water:double-sweet:double----------------------+show():void............(其他水果类不再列出)(5)创新与难点:给水果基类增加了一个虚函数,voidshow();在基类里的函数体目的是为了显示水果的颜色,含糖量,含水量。而在每种水果派生类的show()函数里都加了一个属于该水果的一个输出语句。这样当定义一个水果基类的指针来调用派生类的show时,可以体现出多态性。难点在于对工厂模式和singleton模式的理解,理解如何把类的实例化延迟到子类。理解为什么要延迟类的实例化,是因为往往因为子类太多,刚开始并不知道到底要实例化哪一个。只会实例化一个唯一的水果工厂在于静态成员变量的值不为0后(即为水果工厂对象的地址后),就不能再次实例化出一个对象来。(6)课程设计过程的心得体会:刚拿到课程设计的题目时,根本看不懂什么是工厂模式和singleton模式。于是我把课程设计上的代码在VC上敲了一遍,然后单步一下。似乎逐渐理解了。再结合老师的要求,和百度一些关于工厂模式和singleton模式的介绍,终于算对两个模式有了了解。于是,就开始按照课程设计要求开始编写程序。另外我还通过实践得到到虽然虚基类不能实例化,但是并不是意味其中只含有纯虚函数,其中也可以定义别的函数,在派生类当中调用。当以后再遇到不懂的问题时,我不会再以看不懂为借口而不看,而是自己试一试。多看一看,争取理解。或许有时候一种思想或者一种模式并不理解,但可以通过敲别人的代码来慢慢理解,最后自己能够敲出代码才算对思想的理解。附录:源程序代码://Fruit.h#ifndef_FRUIT_#define_FRUIT_classFruit{public:virtual~Fruit()=0;virtualvoidshow()const;char*GetColor(){returncolor;}doubleGetWater(){returnwater;}doubleGetSweet(){returnsweet;}protected:Fruit(charcolor[],doublewater,doublesweet);private:charcolor[20];//颜色doublewater;//每100g含水量doublesweet;//含糖量};classApple:publicFruit{public:~Apple();Apple(charcolor[],doublewater,doublesweet);voidshow()const;protected:private:};classPear:publicFruit{public:~Pear();Pear(charcolor[],doublewater,doublesweet);voidshow()const;protected:private:};classStrawberry:publicFruit{public:~Strawberry();Strawberry(charcolor[],doublewater,doublesweet);voidshow()const;protected:private:};classBanana:publicFruit{public:~Banana();Banana(charcolor[],doublewater,doublesweet);voidshow()const;protected:private:};classPeach:publicFruit{public:~Peach();Peach(charcolor[],doublewater,doublesweet);voidshow()const;protected:private:};#endif~_FRUIT_H//FruitFactory.h#ifndef_FRUITFACTORY#define_FRUITFACTORYclassFruit;classFactory{public:virtual~Factory()=0;virtualFruit*CreateFruit(intchoice)=0;staticFactory*Instance();//唯一protected:Factory();private:staticFactory*_instance;};classConcreteFactory:publicFactory{public:ConcreteFactory();~ConcreteFactory();Fruit*CreateFruit(intchoice);protected:private:};#endif//~_FRUITFACTORY//Fruit.cpp#includeFruit.h#includeiostream#includecstringusingnamespacestd;Fruit::Fruit(charcolor[],doublewater,doublesweet){strcpy(this-color,color);this-water=water;this-sweet=sweet;}voidFruit::show()const{cout\tcolor\twater\tsweetendl;cout\tcolor\twater\tsweetendl;}Fruit::~Fruit(){}Apple::Apple(charcolor[],doublewater,doublesweet):Fruit(color,water,sweet){cout\tApple!endl;}voidApple::show()const{Fruit::show();cout\tAnappleadaykeepsthedoctoraway.endl;}Apple::~Apple(){}Pear::Pear(charcolor[],doublewater,doublesweet):Fruit(color,water,sweet){cout\tPear!endl;}voidPear::show()const{Fruit::show();cout\tRelievingcoughandreducingsputumendl;}Pear::~Pear(){}Banana::Banana(charcolor[],doublewater,doublesweet):Fruit(color,water,sweet){cout\tBanana!endl;}voidBanana::show()const{Fruit::show();cout\tHeatrunchangendl;}Banana::~Banana(){}Peach::Peach(charcolor[],doublewater,doublesweet):Fruit(color,water,sweet){cout\tPeach!endl;}voidPeach::show()const{Fruit::show();cout\tMonkeylikeit!endl;}Peach::~Peach(){}Strawberry::Strawberry(charcolor[],doublewater,doublesweet):Fruit(color,water,sweet){cout\tStrawberry!endl;}voidStrawberry::show()const{Fruit::show();cout\tIlikeit!endl;}Strawberry::~Strawberry(){}//FruitFactory.cpp#includeFruit.h#includeF
本文标题:C++课程设计3
链接地址:https://www.777doc.com/doc-4973864 .html