课程作业(七)


GitHub Inherit


简单的继承和派生

#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++简单工厂模式
设计模式干货系列:(一)简单工厂模式

posted @ 2017-06-09 20:52  Eventide  阅读(194)  评论(0编辑  收藏  举报