图形工厂 课程设计报告正文.docx
《图形工厂 课程设计报告正文.docx》由会员分享,可在线阅读,更多相关《图形工厂 课程设计报告正文.docx(23页珍藏版)》请在冰豆网上搜索。
图形工厂课程设计报告正文
目录
1前言2
2需求分析2
2.1任务和要求2
2.2运行环境2
2.3开发工具2
3分析和设计3
3.1系统分析及设计思路3
3.2主要类图4
3.3函数流程图5
4具体代码实现6
5课程设计总结6
5.1程序运行结果或预期运行结果17
5.2设计结论22
参考文献22
致谢23
1前言
工厂模式是我们最常用的模式了,著名的Jive论坛,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。
为什么工厂模式是如此常用?
因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如Aa=newA()工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。
2需求分析
2.1任务和要求
设计一个使用空格和星号绘制图形的工厂,该工厂可以根据用户选择绘制不同的图形(如矩形、三角形、菱形、平行四边形、梯形等)。
具体要求:
(1)至少能够绘制6种以上的图形。
(2)可以绘制的图形名称保存在文本文件中。
(3)根据用户选择设置图形参数绘制图形,并记录绘制了的图形的个数。
(4)显示已经绘制的图形的总数。
2.2运行环境
(1)WINDOWS2000/XP系统
(2)VisualC++6.0编译环境或DEVC++5.0编译环境
2.3开发工具
C++语言
3分析和设计
3.1系统分析及设计思路
系统要求设计一个使用空格和星号绘制图形的工厂,该工厂可以根据用户选择绘制至少6种以上不同的图形(如矩形、三角形、菱形、平行四边形、梯形等)。
把可以绘制的图形名称保存在文本文件中,并实现根据用户选择设置图形参数绘制图形,并记录和显示绘制了的图形的个数。
利用文件流的打开、关闭及使用方法实现:
把可以绘制的图形名称保存在文本文件中并显示在运行屏幕上。
定义文件类infile类读取保存可以绘制的图形名称在文本文件shapeFactory.txt。
利用工厂模式的设计模式定义ShapeFactory工厂类,并定义抽象基类BaseShape类和7个具体图形派生类:
直线Line(),梯形Echelon(),直角三角形RightTriangle(),等边三角形EquilateralTriangle(),矩形Rectangle(),正方形Square(),菱形Diamond(),构造绘制图形函数DrawShape()并调用,实现根据用户选择绘制图形。
3.2主要类图
工厂类:
ShapeFactory类;
抽象类:
BaseShape类;
具体类:
直线Line类,梯形Echelon类,直角三角形RightTriangle类, 等边三角形EquilateraTriangle类,矩形Rectangle类,正方形Square类,菱形Diamond类。
图3.1图形工厂类图
3.3函数流程图
Draw函数和SelectShape函数流程图如下图3.2函数流程图
图3.2函数流程图
4具体代码实现
源程序代码如下:
//BaseShape.h文件
#include
usingnamespacestd;
classBaseShape{
public:
BaseShape(){};
virtual~BaseShape(){};
virtualvoidDrawShape()=0;
};
//*********************************
//ShapeFactory.h文件
#include
#include
#include"Echelon.h"
#include"Line.h"
#include"EquilateralTriangle.h"
#include"RightTriangle.h"
#include"Rectangle.h"
#include"Square.h"
#include"Diamond.h"
#include"BaseShape.h"
//定义工厂类
classShapeFactory{
public:
ShapeFactory();
~ShapeFactory();
//BaseShape*SelectShape(string);
BaseShape*SelectShape(stringshape){
if(shape=="Line"||shape=="线")returnnewLine();
if(shape=="RightTriangle"||shape=="直角三角形")returnnewRightTriangle();
if(shape=="EquilateralTriangle"||shape=="等边三角形")returnnewEquilateralTriangle();
if(shape=="Rectangle"||shape=="矩形")returnnewRectangle();
if(shape=="Square"||shape=="正方形")returnnewSquare();
if(shape=="Diamond"||shape=="菱形")returnnewDiamond();
if(shape=="Echelon"||shape=="梯形")returnnewEchelon();
elsecout<<"输入的图形名称错误!
"<}
};
//ShapeFactory.cpp文件
#include"ShapeFactory.h"
ShapeFactory:
:
ShapeFactory(void)
{ }
ShapeFactory:
:
~ShapeFactory(void)
{ }
//********************************************
//Line.h文件
///////////////////直线Line/////////////////////
#include"BaseShape.h"
classLine:
publicBaseShape{
private:
intn;
staticintL;
public:
Line(){};
virtual~Line(){};
//构造函数成员初始化列表,构造函数之后,函数体之前。
Line(intn):
n(n){}
//覆盖抽象类的纯虚函数
virtualvoidDrawShape();
};
//Line.cpp文件
#include"Line.h"
//绘制直线
voidLine:
:
DrawShape(){
intn;
staticintL;
cout<<"请选择直线长度:
"<cin>>n;
for(inti=0;icout<<"*";
}
L++;
cout<}
//********************************************
//Echelon.h文件
///////////////////梯形Echelon/////////////////////
#include"BaseShape.h"
classEchelon:
publicBaseShape{
private:
intupside,downside;
staticintE;
public:
Echelon(){};
virtual~Echelon(){};
Echelon(intupside,intdownside)
:
upside(upside),downside(downside){}
virtualvoidDrawShape();
};
//Echelon.cpp文件
//绘制梯形
voidEchelon:
:
DrawShape(){
intupside,downside;
staticintE;
cout<<"请选择输入要组成梯形的上底、下底:
";
cin>>upside>>downside;
for(inti=upside;ifor(intj=downside-i;j>0;j--)
{cout<<"";}
for(intk=1;k<=i+2;k++)
{cout<<"*";}
cout<}
E++;
cout<}
//*********************************************
//Diamond.h文件
///////////////////菱形Diamond/////////////////////
#include"BaseShape.h"
classDiamond:
publicBaseShape{
private:
intn;
staticintD;
public:
Diamond(){};
virtual~Diamond(){};
//构造函数成员初始化列表,构造函数之后,函数体之前。
Diamond(intn):
n(n){}
//覆盖抽象类的纯虚函数
virtualvoidDrawShape();
};
//Diamond.cpp文件
#include"Diamond.h"
//绘制菱形
voidDiamond:
:
DrawShape(){
intn;
staticintD;
cout<<"要得到的菱形的边长大小:
"<cin>>n;
////////////上三角//////////
for(inti=1;i<=n;++i){
for(intj=1;j<=n-i;++j)
cout<<"";
for(j=1;j<=i;++j)
cout<<"*";
cout<}
//////////下三角///////////
for(i=n;i>=1;--i){
for(intj=1;j<=n-i;++j)
cout<<"";
for(j=1;j<=i;++j)
cout<<"*";
cout<}
D++;
cout<}
//*********************************************
//EquilateralTriangle.h文件
////////////////等边三角形EquilateralTriangle//////////////////
#include"BaseShape.h"
classEquilateralTriangle:
publicBaseShape{
private:
intn;
staticintET;
public:
EquilateralTriangle(){};
virtual~EquilateralTriangle(){};
//构造函数成员初始化列表,构造函数之后,函数体之前。
EquilateralTriangle(intn):
n(n){}
//覆盖抽象类的纯虚函数
virtualvoidDrawShape();
};
//EquilateralTriangle.cpp文件.
#include"EquilateralTriangle.h"
//绘制等边三角形
voidEquilateralTriangle:
:
DrawShape(){
intn;
staticintET;
cout<<"请选择输入要组成等边三角形的行数n(n>2):
";
cin>>n;
for(inti=1;i//控制每行星号个数
for(intj=n-i;j>=0;j--)
{cout<<"";}
for(intk=1;k<=2*i-1;k++)
{cout<<"*";}
cout<}
ET++;
cout<}
//*********************************************
//Rectangle.h文件
///////////////////矩形Rectangle/////////////////////
#include"BaseShape.h"
classRectangle:
publicBaseShape{
private:
intwidth,height;
staticintR;
public:
Rectangle(){};
virtual~Rectangle(){};
Rectangle(intwidth,intheight):
width(width),height(height){}
virtualvoidDrawShape();
};
//Rectangle.cpp文件
#include"Rectangle.h"
//绘制矩形
voidRectangle:
:
DrawShape(){
intwidth,height;
staticintR;
cout<<"请选择输入矩形的长和宽:
";
cin>>width>>height;
cout<for(inti=1;i<=height;i++){
if(i==1||i==height){//输出长,即第一行和最后一行星号
for(intj=1;j<=width;j++)
cout<<"*";
cout<}
else{
cout<<"*";
for(intj=2;j<=2*(width-2)+2;j++)//其中2*(side-2)+2为宽除星号外的空格数
cout<<"";
cout<<"*"<}
}
R++;
cout<}
//*********************************************
//RightTriangle.h文件
///////////////////直角三角形RightTriangle/////////////////////
#include"BaseShape.h"
classRightTriangle:
publicBaseShape{
private:
intn;
staticintRT;
public:
RightTriangle(){};
virtual~RightTriangle(){};
//构造函数成员初始化列表,构造函数之后,函数体之前。
RightTriangle(intn):
n(n){}
//覆盖抽象类的纯虚函数
virtualvoidDrawShape();
};
//RightTriangle.cpp文件
#include"RightTriangle.h"
//绘制直角三角形
voidRightTriangle:
:
DrawShape(){
intn;
staticintRT;
cout<<"请选择输入要组成直角三角形的行数n(n>2):
";
cin>>n;
for(inti=0;ifor(intj=1;j<=i+1;j++)//控制每行星号个数
{cout<<"*";}
cout<}
RT++;
cout<}
//*********************************************
//Square.h文件
///////////////////正方形Square/////////////////////
#include"BaseShape.h"
classSquare:
publicBaseShape{
private:
intside;
staticints;
public:
Square(){};
virtual~Square(){};
Square(intside):
side(side){}
virtualvoidDrawShape();
};
//Square.cpp文件
#include"Square.h"
//绘制正方形
voidSquare:
:
DrawShape(){
staticints;
intside;
cout<<"请选择输入正方形的边长:
";
cin>>side;
cout<for(inti=1;i<=side;i++){
if(i==1||i==side){//输出长,即第一行和最后一行星号
for(intj=1;j<=side;j++)
cout<<"*";
cout<}
else{
cout<<"*";
for(intj=2;j<=2*(side-2)+2;j++)//其中2*(side-2)+2为宽除星号外的空格数
cout<<"";
cout<<"*"<}
}
s++;
cout<}
//*********************************************
/*
设计一个使用空格和星号绘制图形的工厂,该工厂可以根据用户选择绘制不同的图形(如矩形?
三角形?
菱形?
平行四边形?
梯形等)?
具体要求:
(1)至少能够绘制6种以上的图形?
(2)可以绘制的图形名称保存在文本文件中?
(3)根据用户选择设置图形参数绘制图形,并记录绘制了的图形的个数?
(4)显示已经绘制的图形的总数?
*/
#include
#include
#include
#include"Echelon.h"
#include"Line.h"
#include"EquilateralTriangle.h"
#include"RightTriangle.h"
#include"Rectangle.h"
#include"Square.h"
#include"Diamond.h"
#include"BaseShape.h"
#include"ShapeFactory.h"
#include
usingnamespacestd;
intmain(){
/*
读infile类的文件ShapeFactoryFile.txt中可绘制的图形并为每行加上"行号-",输出到运行屏幕上。
*/
ifstreaminfile("ShapeFactoryFile.txt");
if(!
infile){//检验文件是否成功打开
cout<<"sorry!
UnabletoopenShapeFactoryFile."<return-1;
}
stringline;
vectortext;
while(getline(infile,line)){
text.push_back(line);
}
for(intj=0;jcout<cout<//定义工厂对象、基类指针
ShapeFactoryfactory;
BaseShape*pBaseShape;
stringshape;
intt=0;
while(true){
cout<<"请输入图形(英文或中文)名称(以#为结束程序):
";
cin>>shape;
if(shape=="#")break;
BaseShape*pBaseShape=factory.SelectShape(shape);//选择具体类
pBaseShape->DrawShape();//调用具体类的画法
deletepBa