图形工厂论文
来源:互联网 发布:nginx静态资源 编辑:程序博客网 时间:2024/06/14 01:17
我竟然敲着敲着也敲出了400多行的代码,不错不错,值得表扬^_^
1前言
工厂模式是我们最常用的模式了,著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。
为什么工厂模式是如此常用?因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。
2需求分析
2.1 任务和要求
设计一个使用空格和星号绘制图形的工厂,该工厂可以根据用户选择绘制不同的图形(如矩形、三角形、菱形、平行四边形、梯形等)。
具体要求:
(1)至少能够绘制6种以上的图形。
(2)可以绘制的图形名称保存在文本文件中。
(3)根据用户选择设置图形参数绘制图形,并记录绘制了的图形的个数。
(4)显示已经绘制的图形的总数。
2.2运行环境
(1)WINDOWS2000/XP系统
(2)Visual C++ 6.0编译环境或DEV C++ 5.0编译环境
2.3开发工具
C++语言
3分析和设计
3.1 系统分析及设计思路
系统要求设计一个使用空格和星号绘制图形的工厂,该工厂可以根据用户选择绘制至少6种以上不同的图形(如矩形、三角形、菱形、平行四边形、梯形等)。把可以绘制的图形名称保存在文本文件中,并实现根据用户选择设置图形参数绘制图形,并记录和显示绘制了的图形的个数。
利用文件流的打开、关闭及使用方法实现:把可以绘制的图形名称保存在文本文件中并显示在运行屏幕上。定义文件类infile类读取保存可以绘制的图形名称在文本文件shapeFactory.txt。
利用工厂模式的设计模式定义ShapeFactory工厂类,并定义抽象基类BaseShape类和7个具体图形派生类:直线Line(),梯形Echelon(),直角三角形RightTriangle(),等边三角形EquilateralTriangle(),矩形Rectangle(),正方形Square(),菱形Diamond(),构造绘制图形函数DrawShape()并调用,实现根据用户选择绘制图形。
源程序代码如下:// BaseShape.h文件#include <iostream>using namespace std;class BaseShape {public:BaseShape() {};virtual ~BaseShape() {};virtual void DrawShape() = 0;};//*********************************//ShapeFactory.h文件#include <fstream>#include <string>#include "Point.h"#include "Line.h"#include "EquilateralTriangle.h"#include "RightTriangle.h"#include "Rectangle.h"#include "Square.h"#include "Diamond.h"#include "BaseShape.h"//定义工厂类class ShapeFactory{public:ShapeFactory();~ShapeFactory();//BaseShape* SelectShape(string);BaseShape* SelectShape(string shape) {if(shape=="Point" ||shape=="点")return new Point();if(shape=="Line" || shape=="线")return new Line();if(shape=="RightTriangle" || shape=="直角三角形")return new RightTriangle();if(shape=="EquilateralTriangle" || shape=="等边三角形") return new EquilateralTriangle();if(shape=="Rectangle" || shape=="矩形")return new Rectangle();if(shape=="Square" || shape=="正方形")return new Square();if(shape=="Diamond" || shape=="菱形")return new Diamond();else cout<< "输入的图形名称错误!" <<endl; }};// ShapeFactory.cpp文件#include "ShapeFactory.h"ShapeFactory::ShapeFactory(void){ }ShapeFactory::~ShapeFactory(void){ }//********************************************///////////////////点Point/////////////////////// Point.h文件#include "BaseShape.h"class Point : public BaseShape {private:int n;static int P;public:Point() {};virtual ~Point() {};virtual void DrawShape();};// Point.cpp文件#include "Point.h"//绘制点void Point::DrawShape() {static int P;cout<< "*"<<endl;P++; cout<<endl<< "^_^ 您已经绘制"<< P << "个点^_^ "<<endl;}//********************************************// Line.h文件///////////////////直线Line/////////////////////#include "BaseShape.h"class Line : public BaseShape {private:int n;static int L;public:Line() {};virtual ~Line() {};//构造函数成员初始化列表,构造函数之后,函数体之前。Line ( int n) : n(n) { }//覆盖抽象类的纯虚函数virtualvoid DrawShape();};// Line.cpp文件#include "Line.h"//绘制直线void Line ::DrawShape() {int n;static int L;cout<< "请选择直线长度: " <<endl;cin>> n;for(int i=0; i<n; i++) {cout<< "*" ;}L++; cout<<endl<< "^_^ 您已经绘制"<< L << "条直线^_^ "<<endl;}//*********************************************// Diamond.h文件///////////////////菱形Diamond/////////////////////#include "BaseShape.h"class Diamond :public BaseShape {private:int n;static int D;public:Diamond(){};virtual ~Diamond() {};//构造函数成员初始化列表,构造函数之后,函数体之前。Diamond ( int n) : n(n) { }//覆盖抽象类的纯虚函数virtual void DrawShape();};// Diamond.cpp文件#include "Diamond.h"//绘制菱形void Diamond::DrawShape () {int n;static int D;cout<<"要得到的菱形的边长大小:"<<endl;cin>> n;////////////上三角//////////for(int i=1;i<=n;++i){for(int j=1;j<=n-i;++j)cout<<" ";for(j=1;j<=i;++j)cout<<"* ";cout<<endl;}//////////下三角/////////// for( i=n;i>=1;--i){for(int j=1;j<=n-i;++j)cout<<" ";for(j=1;j<=i;++j)cout<<"* ";cout<<endl;}D++; cout<<endl<< "^_^ 您已经绘制"<< D << "个菱形^_^ "<<endl;}//*********************************************// EquilateralTriangle.h文件////////////////等边三角形EquilateralTriangle//////////////////#include "BaseShape.h"class EquilateralTriangle : public BaseShape {private:int n;static int ET;public:EquilateralTriangle() {};virtual ~EquilateralTriangle() {};//构造函数成员初始化列表,构造函数之后,函数体之前。EquilateralTriangle ( int n) : n(n) { }//覆盖抽象类的纯虚函数virtualvoid DrawShape();};// EquilateralTriangle.cpp文件.#include "EquilateralTriangle.h"//绘制等边三角形void EquilateralTriangle::DrawShape() {int n;static int ET;cout<< "请选择输入要组成等边三角形的行数n(n>2):";cin>>n;for(int i=1; i<n+1; i++) { //控制行数//控制每行星号个数for(int j=n-i; j>=0; j--) { cout<< " "; }for(int k=1; k<=2*i-1; k++) { cout<< "* ";}cout<<endl;}ET++; cout<<endl<< "^_^ 您已经绘制"<< ET << "个等边三角形^_^ "<<endl;}//*********************************************// Rectangle.h文件///////////////////矩形Rectangle/////////////////////#include "BaseShape.h"class Rectangle:public BaseShape {private:int width, height;static int R;public:Rectangle() {};virtual ~Rectangle() {};Rectangle( int width, int height) : width(width), height(height){ }virtual void DrawShape();};// Rectangle.cpp文件#include "Rectangle.h"//绘制矩形void Rectangle::DrawShape() {int width, height; static int R; cout<< "请选择输入矩形的长和宽: "; cin>> width >> height; cout<<endl; for (int i=1; i<=height; i++) { if (i==1 || i==height) {//输出长,即第一行和最后一行星号 for(int j=1; j<=width; j++) cout<< "* "; cout<<endl; } else {cout<< "*"; for(int j=2; j<=2*(width-2)+2; j++)//其中2*(side-2)+2为宽除星号外的空格数 cout<< " "; cout<< "*" <<endl; } }R++; cout<<endl<< "^_^ 您已经绘制"<< R << "个矩形^_^ "<<endl;}//*********************************************// RightTriangle.h文件///////////////////直角三角形RightTriangle /////////////////////#include "BaseShape.h"class RightTriangle : public BaseShape {private:int n;static int RT;public:RightTriangle() {};virtual ~RightTriangle() {};//构造函数成员初始化列表,构造函数之后,函数体之前。RightTriangle ( int n) : n(n) { }//覆盖抽象类的纯虚函数virtual void DrawShape();};// RightTriangle.cpp文件#include "RightTriangle.h"//绘制直角三角形void RightTriangle::DrawShape() {int n; static int RT;cout<< "请选择输入要组成直角三角形的行数n(n>2):";cin>>n;for(int i=0; i<n; i++) { //控制行数for(int j=1; j<=i+1; j++)//控制每行星号个数{ cout<< "* "; }cout<<endl;}RT++; cout<<endl<< "^_^ 您已经绘制"<< RT << "个直角三角形^_^ "<<endl;}//*********************************************// Square.h文件///////////////////正方形Square/////////////////////#include "BaseShape.h"class Square : public BaseShape {private:int side;static int s;public:Square() {};virtual ~Square() {};Square ( int side) : side(side) { }virtual void DrawShape();};// Square.cpp文件#include "Square.h"//绘制正方形void Square::DrawShape() {static int s;int side; cout<< "请选择输入正方形的边长: "; cin>> side;cout<<endl; for (int i=1; i<=side; i++) { if (i==1 || i==side) {//输出长,即第一行和最后一行星号 for(int j=1; j<=side; j++) cout<< "* "; cout<<endl; } else { cout<< "*"; for(int j=2;j<=2*(side-2)+2;j++)//其中2*(side-2)+2为宽除星号外的空格数 cout<< " "; cout<< "*" <<endl; } }s++; cout<<endl<< "^_^ 您已经绘制"<< s << "个正方形^_^ "<<endl;}//*********************************************/* 设计一个使用空格和星号绘制图形的工厂,该工厂可以根据用户选择绘制不同的图形(如矩形?三角形?菱形?平行四边形?梯形等)? 具体要求:(1)至少能够绘制6种以上的图形?(2)可以绘制的图形名称保存在文本文件中?(3)根据用户选择设置图形参数绘制图形,并记录绘制了的图形的个数?(4)显示已经绘制的图形的总数?*/#include <fstream>#include <vector>#include <string>#include "Point.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 <iostream>using namespace std;int main() {/*读infile类 的文件ShapeFactoryFile.txt中可绘制的图形并为每行加上"行号-",输出到运行屏幕上。*/ifstream infile("ShapeFactoryFile.txt");if(!infile) {//检验文件是否成功打开cout<< "sorry! Unable to open ShapeFactoryFile. " <<endl;return -1;}string line;vector<string> text;while (getline(infile,line)) {text.push_back(line);} for(int j=0; j<text.size(); j++)cout<< j+1 << " - " << text[j] <<endl;cout<<endl << "*************以上是可以绘制的图形名***************" <<endl<<endl;//定义工厂对象、基类指针ShapeFactory factory;BaseShape * pBaseShape;string shape;int t=0;while(true) {cout<<"请输入图形(英文或中文)名称(以#为结束程序): ";cin>>shape;if(shape=="#") break;BaseShape* pBaseShape=factory.SelectShape(shape);//选择具体类pBaseShape->DrawShape();//调用具体类的画法delete pBaseShape;t++;cout<< "您总共已经输出"<< t <<"个图形。" <<endl; }return 0;}
- 图形工厂论文
- Java工厂设计模式论文
- 图形程序与布丁工厂
- 创建型模式之简单工厂模式(绘制图形)
- 论文
- 论文
- 论文
- 论文
- 论文
- 论文
- 论文
- 论文
- 论文
- 论文
- 论文
- 论文
- 论文
- 论文
- CreateThread CreateMutex
- 浅谈 引用
- VC++6.0调试入门
- Latex的几种参考文献排序
- javascript遍历json格式的数据
- 图形工厂论文
- Visual C++开发工具与调试技巧整理
- 接口与抽象类的几点区别
- fedora16,install fvwm,default runlevel3
- bonnie++、dbench、iozone工具
- 再看八皇后问题
- UVA 156 - Ananagrams
- ubuntu install cx_Oracle
- 简述编译进内核的平台设备是如何在内核注册的(by liukun3211咕唧咕唧)