题目描述
- 请将随机生成数字、表达式的部分设计成:一个Random基类,基类中有random()方法。并由该基类派生出RandomNumber类、RandomOperation类,继承并覆盖父类方法。
- 学习简单工厂模式,思考能否将该模式运用到题目的第一点要求中。
作业要求
- 体会继承和多态的思想
- 发表一篇博客,博客内容为:提供本次作业的github链接,题目描述的代码部分的解释、简单工厂模式的学习。
代码解释
改写后的程序共有四类,它们之间的继承派生关系如下:
基类:
class Random //基类
{
protected:
int n; //作为随机数使用
public:
virtual void random()=0; //纯虚函数,留给派生类重载
};
(直接派生类)生成随机数类:
class RandomNumber:virtual public Random //生成随机数
{
protected:
int num[5]; //添加成员,存储随机数
public:
void random(); //重载
int get_number(int i)
{
return num[i];
}
};
(直接派生类)生成随机运算符
class RandomOperation:virtual public Random //生成随机运算符
{
protected:
char operation[4]; //添加成员,存储随机符号
public:
void random(); //重载
char get_operation(int i)
{
return operation[i];
}
};
(间接派生类)生成随机式子
class RandomExpression:public RandomOperation,public RandomNumber //随机式子部分
{
public:
RandomExpression(); //构造函数
RandomExpression(RandomNumber &t1,RandomOperation &t2) //构造函数
{
for(int i=1;i<5;i++)
{
num[i]=t1.get_number(i);
}
for(int i=1;i<4;i++)
{
operation[i]=t2.get_operation(i);
}
}
void random(){};
void random(char s[30]);
};
其中随机数字类的成员函数:
void RandomNumber::random() //生成随机数字类的成员函数
{
srand(time(0));
for(int j=1;j<=4;j++)
{
n=rand()%10;
num[j]=n;
}
}
随机运算符类的成员函数:
void RandomOperation::random() //随机运算符类的成员函数
{
srand(time(0));
for(int j=1;j<=3;j++)
{
n=rand()%4;
switch(n)
{
case 0:operation[j]='+';break;
case 1:operation[j]='-';break;
case 2:operation[j]='*';break;
default:operation[j]='/';
}
}
}
随机式子部分较长不贴出。
我对于继承和多态的看法:使用继承和多态,能够省去类之间的共同部分,同时它将类之间的共同部分抽取出来作为基类,由基类层层派生,使得各类之间的逻辑关系更加得清晰。
简单工厂模式的学习
工厂模式有简单工厂模式、工厂方法模式和抽象工厂模式三种,本次要求学习的是简单工厂模式。
简单工厂模式的核心思想是:有一个专门的类来负责创建实例的过程。
简单工厂模式中包含的角色及其相应的职责如下:
- 工厂角色(Creator):这是简单工厂模式的核心,由它负责创建所有的类的内部逻辑。当然工厂类必须能够被外界调用,创建所需要的产品对象。
- 抽象(Product)产品角色:简单工厂模式所创建的所有对象的父类,注意,这里的父类可以是接口也可以是抽象类,它负责描述所有实例所共有的公共接口。
- 具体产品(Concrete Product)角色:简单工厂所创建的具体实例对象,这些具体的产品往往都拥有共同的父类。
我的理解是存在一个“工厂”,用户只需给它下达命令,这个“工厂”就能够生产出各种用户所需的不同“产品”,而这些“产品”都有着共同的父类。在这个程序当中,父类即为Random类,“产品”则是RandomNumber、RandomOperation和RandomExpression这三类。工厂通过用户的命令来进行不同的调用。
优点:能够根据不同的外界信息进行类的调用,各类的职责分明,优化了程序结构。
缺点:当要增加新的类时,既要补充新类,也要改变工厂类,违背了“系统对扩展开放,对修改关闭”的原则。
参考资料:
1.http://www.cnblogs.com/toutou/p/4899388.html
2.http://blog.chinaunix.net/uid-25958655-id-4243289.html
3.http://blog.csdn.net/weiwenlongll/article/details/6918164