简单的继承和派生
#include<iostream>
#include<ctime>
using namespace std;
#define RANDOM(a,b) (rand()%(b-a+1)+a)
class Random
{
public:
int random() {}
};
class RandomNumber :public Random
{
private:
bool ifGenerateSeed = false;//标识是否已生成随机数种子
public:
RandomNumber() {}
int random(int down, int up)
{
if (!ifGenerateSeed)//如果未生成随机数种子
{
ifGenerateSeed = true;
srand((unsigned)time(NULL));//生成随机数种子
}
return RANDOM(down, up);
}
};
class RandomOperation :public Random
{
public:
RandomOperation() {}
char random(char ifMultiplyDivide)
{
int tmp;
RandomNumber x;
if (ifMultiplyDivide == 'y')//允许乘除
{
tmp = x.random(1, 4);
switch (tmp)
{
case 1:
{
return '+';
break;
}
case 2:
{
return '-';
break;
}
case 3:
{
return '*';
break;
}
case 4:
{
return '/';
break;
}
}
}
else//不允许乘除
{
tmp = x.random(1, 2);
switch (tmp)
{
case 1:
{
return '+';
break;
}
case 2:
{
return '-';
break;
}
}
}
}
};
int main()
{
RandomNumber x;
cout << x.random(0, 100) << endl;
RandomOperation y;
cout << y.random('y') << endl;
return 0;
}
简单的工厂
简单工厂模式是工厂模式中最简单的一种。它用比较简单的方式隐藏创建对象的细节,只需要告诉工厂类所需要的类型,工厂类就会返回需要的产品类。客户唯一需要知道的具体子类就是工厂类。
假如不用工厂类,只用Random类和它的子类,那客户每次使用不同的子类的时候都需要知道到底是用哪一个子类。当类比较少的时候还没什么问题,但是当类比较多的时候,管理起来就非常的麻烦了,很容易发生错误。而使用工厂类则不会有这样的问题,不管里面多少个类,客户只需要知道类型号即可。
不过,这边还可能会出现这样一个问题,那就是客户可能每次需要的产品各不相同,这样如果所需产品是我们无法生产的时,就必须修改源码了。所以,简单工厂模式一般适用于程序中有多种同类型类的情况。而如果要解决这个问题,就需要运用到工厂模式了。
下面做一个简单的总结:
适用场景
客户需求的产品大部分类型相似,也就是程序中有多种同类型类的情况,这样就不必频繁建造新工厂,工厂也不需要频繁更新生产线,修改代码时也只需要修改少部分的一些地方。
优点
- 隐藏了对象创建的细节,将产品的实例化推迟到工厂中实现;
- 客户只需要关注使用的工厂,提供产品名也便于识别;
- 便于添加新的产品,每次只需要修改工厂类传递的类型值;
- 遵循了设计中的依赖倒转原则。
缺点
- 工厂集中了所有产品的生产责任,降低了类的内聚度;
- 要求产品子类的类型相似,并使用的相同方法名。
代码
#include<iostream>
#include<ctime>
using namespace std;
#define RANDOM(a,b) (rand()%(b-a+1)+a)
class Random
{
public:
Random() {}
virtual int random(int a, int b)
{
return 0;
}
virtual char random(char a)
{
return 0;
}
};
class RandomNumber :public Random
{
private:
bool ifGenerateSeed = false;//标识是否已生成随机数种子
public:
RandomNumber(){}
int random(int down, int up)
{
if (!ifGenerateSeed)//如果未生成随机数种子
{
ifGenerateSeed = true;
srand((unsigned)time(NULL));//生成随机数种子
}
return RANDOM(down, up);
}
};
class RandomOperation :public Random
{
public:
RandomOperation(){}
char random(char ifMultiplyDivide)
{
int tmp;
RandomNumber x;
if (ifMultiplyDivide == 'y')//允许乘除
{
tmp = x.random(1, 4);
switch (tmp)
{
case 1:
{
return '+';
break;
}
case 2:
{
return '-';
break;
}
case 3:
{
return '*';
break;
}
case 4:
{
return '/';
break;
}
}
}
else//不允许乘除
{
tmp = x.random(1, 2);
switch (tmp)
{
case 1:
{
return '+';
break;
}
case 2:
{
return '-';
break;
}
}
}
}
};
class RandomFactory
{
public:
RandomFactory() {}
Random *createRandom(const string &x)
{
if (x == "number")
{
return new RandomNumber;
}
else
{
if (x == "operator")
{
return new RandomOperation;
}
else
{
return NULL;
}
}
}
};
int main()
{
Random *z;
RandomFactory x;
z = x.createRandom("number");
cout << z->random(0, 100) << endl;
RandomFactory y;
z = y.createRandom("operator");
cout << z->random('y') << endl;
return 0;
}
参考链接
详解设计模式之工厂模式(简单工厂+工厂方法+抽象工厂)
三种工厂模式的分析以及C++实现
C++简单工厂模式
设计模式干货系列:(一)简单工厂模式