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();