zoukankan      html  css  js  c++  java
  • 简单工厂模式初步尝试

    简单工厂模式:

    • 官方来说:简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。——来自百度百科
    • 自我理解:通过一些网上知识点分享,在我看来,工厂模式,就是为了进行不同类的操作而出现的,在工厂类中创建一个基类指针,通过传入参数的形式,返回不同的派生类。

    在这里我以自己写的一个以Random为基类,randomNum 和 randomOperator 为派生类,来说明个人对于简单工厂模式的初步理解(目前还没有和整个四则运算牵扯在一起)

    #include<iostream>
    #include<cstdio>
    #include <time.h> 
    using namespace std;
    class Random {                   //基类
    private:
    	int a;
    public:
    	Random() {}
    	~Random(){}
    	virtual int creatrand() { return -1; }   //利用虚函数
    	virtual void print(){}
    };
    class randomNumber :public Random            ///随机数
    {
    public:
    	randomNumber() { cout << "产生随机数: " ; }
    	~randomNumber(){}
    	virtual void print() {
    		cout << changeNum(creatrand());
    	}
    	char changeNum(int k)
    	{
    		return k + 48;
    	}
    	virtual int creatrand();
    };
    int randomNumber::creatrand()
    {
    	return rand() % 10;
    }
    class randomOperator : public Random     //随机符
    {
    public:
    	randomOperator() { cout << "产生随机运算符: " ; }
    	~randomOperator(){}
    	virtual int creatrand();
    	virtual void print() {
    		cout << changeOper(creatrand());
    	}
    	char changeOper(int k);
    };
    char randomOperator::changeOper(int k)
    {
    		switch (k)
    		{
    		case 0:return '+';
    		case 1:return '-';
    		case 2:return '*';
    		case 3:return '/';
    		default:return ' ';
    		}
    }
    int  randomOperator::creatrand()
    {
    	return rand() % 4;
    }
    class Factory {
    public:
    	Factory(){}
    	~Factory(){}
    	Random * produce(int k)
    	{
    		switch (k)
    		{
    		case 1:return new randomNumber();
    		case 2:return new randomOperator();
    		default:return NULL;
    		}
    	}
    };
    int main()
    {
    	Factory * p = new Factory();   //工厂指针
    	int k = 0;
    	cout << "输入想得到的随机类型,0表示输入结束,1表示生成随机数,2表示生成随机符:
    ";
    	while (1)
    	{
    		cin >> k;
    		if (k == 0) break;
    		Random * rand_ptr = p->produce(k); // 派生类类型选择
    		if (rand_ptr == NULL) 
    			cout << "不存在该类型重新输入:";
    		else 
    			rand_ptr->print();   //输出
    		cout << endl;
    		delete rand_ptr;
    	}
    	system("pause");
    	return 0;
    }
    

    运行结果截图:

    体会:

    利用简单工厂模式,可以使得更加体现面向对象的思想,加强了封装性,同样的我认为利用该模式,促进了代码的片段化,进行类的管理,像网上说的一段话:

    做了一个windows 8平台的阅读器。首先,需要将电子书中的内容渲染到屏幕上,而电子书每一页都包含各种各样的内容,比如:图形、图像和文字等等;不同的内容,就是不同的对象;在将不同的内容渲染到屏幕上之前,就需要new操作,建立不同的对象,然后再在屏幕上进行描绘。这个时候,就需要进行很多new操作,new操作分布在代码的不同地方,管理起来很麻烦,而且也很乱,到后期扩展和维护的时候,有的时候,对象多的让开发人员不知道这个对象是干什么的,这就增加了难度;同时,new操作,都会有对应的异常处理,最后,就会发现,在代码中,new了一个对象,然后,就跟着一段异常处理代码,这时编码变的极其混乱和臃肿。那么怎么办?怎么办?此时,我们需要一个新的类,专门从事对象的建立和释放,之后,对象的各种操作,和这个类没有任何关系。这个专门建立对象的类,向外暴漏创建对象的接口,供外部调用。

    工厂模式有一种非常形象的描述,建立对象的类就如一个工厂,而需要被建立的对象就是一个个产品;在工厂中加工产品,使用产品的人,不用在乎产品是如何生产出来的。从软件开发的角度来说,这样就有效的降低了模块之间的耦合。

  • 相关阅读:
    A Bayesian Approach to Deep Neural Network Adaptation with Applications to Robust Automatic Speech Recognition
    nnet3的代码分析
    Kaldi中的L2正则化
    HMM拓扑与转移模型
    Kaldi阅读并更改代码
    nnet3中的数据类型
    nnet3配置中的“编译”
    Kaldi的delta特征
    Kaldi的交叉熵正则化
    【搜索】 Prime Path
  • 原文地址:https://www.cnblogs.com/q1076452761/p/6947519.html
Copyright © 2011-2022 走看看