zoukankan      html  css  js  c++  java
  • 课程作业(七)


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

  • 相关阅读:
    【转】 cin、cin.get()、cin.getline()、getline()、gets()等函数的用法
    HDU How many prime numbers
    《大学ACM的总结 》(转载)
    POJ 最小公倍数
    HDU 开门人和关门人
    HDU shǎ崽 OrOrOrOrz
    HDU Saving HDU 2111
    HDU 1106 排序
    strtok函数()
    HDU 2187汶川地震
  • 原文地址:https://www.cnblogs.com/S031602240/p/6973706.html
Copyright © 2011-2022 走看看