Red de conocimiento de divisas - Consulta hotelera - Clase de definición de C++

Clase de definición de C++

1. Intención

Asegurar que una clase tenga solo una instancia y proporcionar un punto de acceso global para acceder a ella.

2. Motivación

Para algunas clases, es importante tener una sola instancia. Aunque puede haber muchas impresoras en el sistema, sólo debe haber una cola de impresora, un sistema de archivos y un administrador de ventanas. Un filtro digital sólo puede tener un convertidor A/D. Un sistema contable sólo puede estar dedicado a una empresa.

¿Cómo podemos asegurarnos de que una clase tenga solo una instancia y que esta instancia sea fácilmente accesible? Una variable global hace que un objeto sea accesible, pero no impide crear instancias de varios objetos. Un mejor enfoque es hacer que la clase misma sea responsable de guardar su única instancia. Esta clase puede garantizar que no se puedan crear otras instancias (interceptando solicitudes para crear nuevos objetos) y puede proporcionar un método para acceder a la instancia. Este es el patrón Singleton.

3. Aplicabilidad

El patrón Singleton se puede utilizar en las siguientes situaciones cuando una clase puede tener solo una instancia y los clientes pueden acceder a ella desde un punto de acceso conocido. Cuando esta instancia única debería ser extensible mediante subclases y los clientes deberían poder usar una instancia extendida sin cambiar su código.

4. Estructura

5. Participantes

Singleton

Define una operación GetInstance que permite a los clientes acceder a su única instancia. GetInstance es una operación de clase (es decir, un método de clase en Smalltalk y una función miembro estática en C++). Puede ser responsable de crear su propia instancia única.

6. Colaboración

Los clientes solo pueden acceder a una instancia de Singleton a través de la operación GetInstance de Singleton.

7. Efectos

El patrón Singleton tiene muchas ventajas:

1) Acceso controlado a la instancia única Debido a que la clase Singleton encapsula su única instancia. Puede controlar estrictamente cómo y cuándo los clientes acceden a él.

2) Reducir el espacio de nombres El modo Singleton es una mejora de las variables globales. Evita que las variables globales contaminen el espacio de nombres al almacenar instancias únicas.

3) Permite refinar las operaciones y la presentación. La clase Singleton puede tener subclases y es fácil configurar una aplicación con instancias de esta clase extendida. Puede configurar su aplicación en tiempo de ejecución con instancias de las clases que necesita.

4) Permitir un número variable de instancias Este patrón facilita cambiar de opinión y permite múltiples instancias de la clase Singleton. Además, puede utilizar el mismo método para controlar la cantidad de instancias utilizadas por su aplicación. Solo es necesario cambiar las operaciones que permiten el acceso a instancias Singleton.

5) Más flexible que las operaciones de clase Otra forma de encapsular la funcionalidad singleton es usar operaciones de clase (es decir, funciones miembro estáticas en C++ o métodos de clase en Smalltalk). Pero ambas tecnologías lingüísticas dificultan cambiar el diseño para permitir múltiples instancias de una clase.

Además, las funciones miembro estáticas en C++ no son funciones virtuales, por lo que las subclases no pueden redefinirlas polimórficamente.

8. Implementación

clase Singleton

{

static std::auto_ptr m_pInstance;

protected:

//evitar que el usuario cree cualquier instancia manualmente

//El constructor es un tipo protegido.

Singleton(){}

public:

~Singleton(){}

//Devuelve el puntero de instancia de esta clase singleton

Instancia estática Singleton*()

{

if(!m_pInstance.get())

{

m_pInstance = std::auto_ptr(new Singleton());

}

return m_pInstance.get();

} p>

};

¿Cómo usarlo? No intente derivar su subclase singleton de esta clase, ya que ese resultado es inapropiado. Si necesita varias subclases singleton, es más apropiado utilizar la siguiente definición de macro:

#define DEFINE_SINGLETON(cls)\.

privado:\

static std::auto_ptr m_pInstance;\

protected:\

cls(){} \

public:\

~cls(){}\

static cls* Instancia(){\

if(! m_pInstance.get()){\

m_pInstance = std::auto_ptr(new cls());\

}\

return m_pInstance .get();\

}

#define IMPLEMENT_SINGLETON(cls) \

std::auto_ptr cls:: m_pInstance(NULL);

Supongamos que necesita implementar una clase singleton YY, escríbala así:

clase YY

{

DEFINE_SINGLETON (YY) ;

public:

//tus interfaces aquí...

};

En el archivo cpp, escribe :

IMPLEMENT_SINGLETON(YY);

Cuando necesites introducir una instancia de esta clase, usa esta declaración:

YY* pYY = YY::Instance( );

Esto es todo.

Si necesita definir otras clases singleton, simplemente repita la definición anterior.

Cuando desee administrar de forma centralizada todas las configuraciones requeridas por una aplicación, puede declarar una clase CToolsOptions que contenga una colección de propiedades de configuración. Para una instancia de esta clase, obviamente una instancia es suficiente; al escribir un programa de dibujo, considere dibujar rectángulos, círculos, etc. usando clases de herramientas derivadas de CGraphTool respectivamente. Cada clase derivada es responsable de manejar acciones de dibujo específicas y respuestas de UI relacionadas. lógica. Estas clases de herramientas normalmente se seleccionan cuando el usuario selecciona un botón de elemento de la barra de herramientas. Según este modelo, se deben registrar todas las herramientas primitivas para que el programa de dibujo sepa qué herramientas primitivas se pueden utilizar en tiempo de ejecución. De manera similar, el administrador responsable de administrar la información de registro solo necesita una instancia.

上篇: Lista de lugares de residencia de los nuevos casos en Shanghai el 9 de octubre (dónde vive el 1 nuevo caso confirmado localmente en Shanghai) 下篇: ¿Qué tal el curso escolar de toma de notas en línea?
Artículos populares