patrón de diseño singleton C ++

Singleton: tan sólo generan un objeto de clase.

Podemos pensar en la manera de limitar el número de objetos generados clase-do? Sabemos que el objetivo de generar al menos dos pasos para abrir la memoria, llama al constructor. No tenemos ninguna manera de abrir las limitaciones de memoria, pero podemos controlar la situación llama al constructor, a lo largo de esta línea de pensamiento que hemos llegado Singleton ideas de diseño patrón:

  • Para proteger los objetos de interfaz generado que controla el constructor, que establecen el constructor privado, ni aun se llama fuera de la clase. Por lo tanto, el constructor y el constructor de copia privada es el primer paso.
  • Queremos proporcionar una interfaz común para generar un objeto único, cuando diseñamos esta función para cumplir con los dos puntos, 1. tipo de clase no puede ser devuelto debido a que el tipo de clase de la devolución generará un objeto temporal, entonces tenemos los dos objetos , no es así, podemos citar el puntero de la clase y, opcionalmente, una clase. 2. Interfaz de librarse de la dependencia en el objeto, de lo contrario no será capaz de generar el primer objeto, por lo que la puso, objetos estáticos estáticos no pertenecen, que puede ser llamado por la clase.
  • Esta interfaz se llama muchas veces, así que tenemos que asegurar que fue trasladado muchas veces, pero sólo producen un objeto, por lo tanto soy Emei se creó una variable miembro estática para mantener una sola clase, cada juez cuando se llama, si fuera la primera la primera llamada se genera clases, como si la segunda llamada se devuelve directamente categoría.

Que ahora escribimos una clase simple de un patrón singleton de acuerdo con esta línea de pensamiento:

# include <iostream>
class master
{
private:
	master (char* name,bool sex)//构造函数
	{
		mname=new char[strlen(name+1)]();
		strcpy(mname,name);
		msex=sex;
	}
	master(const master&)//拷贝构造
	{}
	char *mname;
	bool msex;
	static master *pinstance;//静态成员变量,保存一个对象的地址
public:
	static master* getinstance(char* name,bool sex)//公共的接口
	{
		if(pinstance==NULL)//第一次则生成对象
		{
			pinstance=new master(name,sex);
		}
		return pinstance;//不是第一次则直接返回第一次生成的对象地址
	}
	void show()
	{
		std::cout<<"生成的对象名字为"<<mname<<std::endl;
	}
};
master* master::pinstance=NULL;//初始化静态成员
int main()
{
	master *pm1=master::getinstance("王麻子", true);//定义对象指针保存对象的地址
	master *pm2=master::getinstance("李四", true);
	master *pm3 = master::getinstance("王五", true);
	pm1->show();
	pm2->show();
	pm3->show();
}

Podemos ver que la principal función de la cual se aplicaron durante tres objetos, el programa generará tres objetos si nos es, todavía es sólo un objeto, tenemos que ver a través de la función de impresión, los resultados que se muestran a continuación:

Podemos ver que el sistema sólo genera el primer objeto para nosotros, Wang Mazi, el programa aborda directamente el regreso de Wang Mazi otros objetos se representan, de manera de lograr un patrón Singleton. Sin embargo, podemos ver que se trata de procedimientos inseguros, y el uso ineficiente de este nuevo tiempo que generamos un objeto único llamado modo vago, también conocida como la carga de retardo , se trata de un seguro para subprocesos de modo.

A continuación, ciertamente no podemos esperar tener un modo seguro para obtener el patrón Singleton, por supuesto, allí, introdujo la siguiente para cada uno el modo de hambre, también conocido como codiciosos cargado , creo que vemos el nombre para saber cuál es el significado de la misma, no se que es un error tomar medidas preventivas con antelación para producir un objeto, el objeto se genera antes de que el principal, así que no hay insegura hilo. código específico de la siguiente manera:

# include <iostream>
class master
{
private:
	master (char* name,bool sex)//构造函数
	{
		mname=new char[strlen(name+1)]();
		strcpy(mname,name);
		msex=sex;
	}
	master(const master&)//拷贝构造
	{}
	char *mname;
	bool msex;
	static master *pinstance;//静态成员变量,保存一个对象的地址
public:
	static master* getinstance(char* name,bool sex)//公共的接口
	{
		return pinstance;//直接返回已经生成的对象地址,保证只有一个对象
	}
	void show()
	{
		std::cout<<"生成的对象名字为"<<mname<<std::endl;
	}
};
master* master::pinstance=new master("王麻子",true);//在主函数之前就已经申请好了对象,所以只会有王麻子这一个对象
int main()
{
	master *pm1=master::getinstance("张三", true);//定义对象指针保存对象的地址
	master *pm2=master::getinstance("李四", true);
	master *pm3 = master::getinstance("王五", true);
	pm1->show();
	pm2->show();
	pm3->show();
}

Podemos ver que cuando una variable miembro estática es válida sólo inicialización de un objeto que hemos hecho que sea un objeto que genera Wang Mazi, por lo que es para que se genere la función principal, y si usted lo define en unos pocos dentro de la función principal los objetos, que no va a generar, dirección Wang Mazi cada vez que vuelva sólo para encontrar objetos en la aplicación, nos fijamos en los resultados: 

patrón Singleton de este diseño es que, por cualquier error Por favor, señalen Oh! Vamos? ♀️

 

 

Publicado 54 artículos originales · ganado elogios 8 · vistas 5323

Supongo que te gusta

Origin blog.csdn.net/qq_43411555/article/details/90341421
Recomendado
Clasificación