2017《面向对象程序设计》课程作业七

2017《面向对象程序设计》课程作业七

031602230 卢恺翔

Github传送门


题目要求

  • 请将随机生成数字、表达式的部分设计成:一个Random基类,基类中有random()方法。并由该基类派生出RandomNumber类、RandomOperation类,继承并覆盖父类方法。
  • 学习简单工厂模式,思考能否将该模式运用到题目的第一点要求中。

简单工厂模式

简单工厂模式(Simple Factor Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

简单工厂模式中包含的角色及其相应的职责如下:

  • 工厂角色(Creator):这是简单工厂模式的核心,由它负责创建所有的类的内部逻辑。当然工厂类必须能够被外界调用,创建所需要的产品对象。
  • 抽象(Product)产品角色:简单工厂模式所创建的所有对象的父类,注意,这里的父类可以是接口也可以是抽象类,它负责描述所有实例所共有的公共接口。
  • 具体产品(Concrete Product)角色:简单工厂所创建的具体实例对象,这些具体的产品往往都拥有共同的父类。

这就像一个小工厂,你不需要知道这些产品是怎么出来的,你只需要下一个订单,他就能生产出你想要的东西。例如本次作业中,通过输入“rannum”就可以让工厂生产随机数,通过输入“ranope”就可以生产出随机符号。这大大降低了代码的难度,只需要通过输入一些指令,就能生产出相应的东西,非常的实用和方便。

但是一旦产品的种类变多的时候,工厂类就需要判断何时创建何种种类的产品,这就和创建何种种类产品的产品相互混淆在了一起,违背了单一职责,导致系统丧失灵活性和可维护性。

生成基类Random

class Random
{
protected:
	int num;		//产生的随机数
	char sym;		//产生的随机字符
public:
	virtual int random()=0;//创造虚函数,建立公共接口
};

派生类RandomNumber

Random.h文件

class RandomNumber :public Random//用于随机生成数字
{
public:
	int random();		//公共接口
};

Random.cpp文件

int RandomNumber::random()//用于随机生成数字
{
	num = rand() % 10 + 1;
	return num;
}

派生类RandomOperation

Random.h文件

class RandomOperation :public Random//用于随机生成运算符
{
public:
	int random();       //公共接口
};

Random.cpp文件

int RandomOperation::random()
{
	int n = rand() % 4;//用于随机生成运算符
	switch (n)
	{
	case 0: sym = '+'; break;
	case 1: sym = '-'; break;
	case 2: sym = '*'; break;
	case 3: sym = '/'; break;
	}
	return sym;
}

创建工厂

class RandomFactory		//创建工厂
{
public:
	Random *randomrandom(string name)	//根据需求来选择产生什么样的产品(生产随机数/随机符号)
	{
		if (name == "rannum")
			return new RandomNumber;
		else if (name == "ranope")
			return new RandomOperation;
	}
};

工厂将通过输入不同的指令来生产不同的产品(生产随机数/随机符号)

在main函数中,不管输入什么不同的指令,都调用相同的接口random函数,就可以产生出不同的产品。所以random函数在这里起着至关重要的类似桥梁的作用。

main.cpp(部分代码,详见GitHub

string generateExpression(int i,char *p)		//用于生成运算式
{
	RandomFactory ranfactory;			//创建工厂
	Random *ranp = ranfactory.randomrandom("rannum");//选择产生随机数
	int n1, n2;
	n1 = ranp->random();
	n2 = ranp->random();
	ranp = ranfactory.randomrandom("ranope");//选择产生随机字符
	char sign;
	sign = ranp->random();
posted @ 2017-06-08 19:58  sungam  阅读(163)  评论(0编辑  收藏  举报