第七次课程作业
第七次课程作业
继承代码
这次作业分为两个部分,主要考察刚学的继承派生的知识,还有简单工厂模式的学习。在 git上提交的是工厂模式的代码,直接的方法如下:
#include <ctime>
#include <iostream>
using namespace std;
class Random //基类
{
public:
virtual void random();
Random() {};
};
class RandomNumber :public Random //生成数字的类
{
private:int num;
public:
void random()
{
srand(time(0));
num = rand() % 10;
}
RandomNumber() { };
};
class RandomOperation :public Random //生成运算符的类
{
private:char ope;
public:
void random()
{
srand(time(0));
int n;
n = rand() % 4;
switch (n)
{
case 0:ope = '+'; break;
case 1:ope = '-'; break;
case 2:ope = '*'; break;
case 3:ope = '/'; break;
}
}
RandomOperation() {};
};
简单工厂模式的学习
通过查阅资料了解到,工厂模式共有三种:简单工厂模式、工厂模式、抽象工厂模式,复杂程度递增。按我的理解简单工厂模式就是一个工厂能生产出不同类型的商品(工厂为一个类),然后客户把需求告诉工厂,工厂通过判断制造出相应的商品。
优点
1.隐藏了对象创建的细节,将产品的实例化推迟到子类中实现。
2.客户端基本不用关心使用的是哪个产品,只需要知道用哪个工厂就行了,提供的类型也可以用比较便于识别的字符串。
3.方便添加新的产品子类,每次只需要修改工厂类传递的类型值就行了。
4.遵循了依赖倒转原则。
缺点
1.要求产品子类的类型差不多,使用的方法名都相同,如果类比较多,而所有的类又必须要添加一种方法,则会是非常麻烦的事情。或者是一种类另一种类有几种方法不相同,客户端无法知道是哪一个产品子类,也就无法调用这几个不相同的方法。
2.每添加一个产品子类,都必须在工厂类中添加一个判断分支,这违背了开放-封闭原则。
常用的场景
例如部署多种数据库的情况,可能在不同的地方要使用不同的数据库,此时只需要在配置文件中设定数据库的类型,每次再根据类型生成实例,这样,不管下面的数据库类型怎么变化,在客户端看来都是只有一个AbstractProduct,使用的时候根本无需修改代码。提供的类型也可以用比较便于识别的字符串,这样不用记很长的类名,还可以保存为配置文件。
这样,每次只需要修改配置文件和添加新的产品子类即可。
所以简单工厂模式一般应用于多种同类型类的情况,将这些类隐藏起来,再提供统一的接口,便于维护和修改。