Le mode singleton du mode de conception (Singleton), en prenant C++ comme exemple, réalise la sortie du journal.

        Bonjour à tous, je n'ai pas mis à jour depuis longtemps, et aujourd'hui je vais vous ajouter le design pattern le plus basique : le pattern singleton. Ce modèle de singleton est vraiment un nœud dans mon cœur. J'ai interviewé le post de l'algorithme de Jingdong vers la fin de 2021. L'intervieweur m'a demandé d'écrire un singleton. Et hahahaha, rappelez-vous que tout est le meilleur arrangement. Cet article présente brièvement le mode singleton et donne l'implémentation du journal en mode singleton.

Table des matières

 1. Une brève introduction au mode singleton

1.1 Introduction de base

1.2 Scénarios d'utilisation du mode Singleton

Deuxièmement, le mode singleton pour réaliser la journalisation (Singleton Logger)

3. Résumé


 1. Une brève introduction au mode singleton

1.1 Introduction de base

        Le mode singleton garantit uniquement qu'une seule instance existe dans un programme et fournit un point d'accès global pour accéder à l'instance. En fait, un seul objet de classe en mode singleton est autorisé à exister. C'est l'opposé de l'idée du multithreading, afin d'assurer le fonctionnement des ressources. Par exemple, le système de journalisation doit enregistrer l'heure, s'il est multithread, il sera désordonné.

        La clé de l'implémentation du modèle Singleton est que le constructeur doit être rendu privé pour empêcher le code externe de créer plusieurs instances. En même temps, vous devez fournir une méthode statique pour obtenir l'instance.Cette méthode va vérifier si une instance existe déjà, et retourner cette instance si elle existe, sinon créer une nouvelle instance et la retourner.

        Voici un exemple de code simple de modèle singleton C++ :

class Singleton {
public:
  static Singleton* GetInstance() {
    if (instance_ == nullptr) {
      instance_ = new Singleton();
    }
    return instance_;
  }

  void DoSomething() {
    // ...
  }

private:
  Singleton() {
    // ...
  }

  static Singleton* instance_;
};

Singleton* Singleton::instance_ = nullptr;

1.2 Scénarios d'utilisation du mode Singleton

  1. Gestionnaire de configuration : dans une application, il peut être nécessaire d'accéder aux informations de configuration à plusieurs endroits, et ces informations de configuration sont généralement en lecture seule. L'utilisation du mode singleton peut garantir que les informations de configuration ne sont chargées qu'une seule fois et, en même temps, fournir un point d'accès global pour accéder aux informations de configuration.
  2. Enregistreur : dans une application, il peut être nécessaire d'enregistrer les informations du journal à plusieurs endroits, et il n'y a généralement qu'un seul enregistreur. L'utilisation du modèle singleton peut garantir qu'un seul enregistreur est créé et fournir un point d'accès global pour enregistrer les informations du journal.
  3. Pool de connexion à la base de données : dans une application, il peut y avoir de nombreux endroits qui doivent se connecter à la base de données, et les connexions à la base de données sont généralement des ressources limitées. Le pool de connexions à la base de données peut être implémenté à l'aide du mode singleton, garantissant que la connexion n'est créée qu'une seule fois et fournissant un point d'accès global pour obtenir la connexion.
  4. Compteur : Dans une application, il peut être nécessaire de compter un événement ou une opération, et il n'y a généralement qu'un seul de ces compteurs. L'utilisation du modèle singleton peut garantir que le compteur n'est créé qu'une seule fois et fournir un point d'accès global à compter.
  5. Gestionnaire de cache : dans une application, certaines données doivent être mises en cache et la capacité des données mises en cache est généralement limitée. Le gestionnaire de cache peut être implémenté à l'aide du modèle singleton, garantissant que le cache n'est créé qu'une seule fois et fournissant un point d'accès global pour accéder aux données mises en cache.

Deuxièmement, le mode singleton pour réaliser la journalisation (Singleton Logger)

#include <iostream>
#include <fstream>
#include <string>
#include <ctime>

using namespace std;

class Logger {
private:
    static Logger* instance;
    ofstream logFile;

    Logger() {
        string filename = "log.txt";
        logFile.open(filename.c_str(), ios::out | ios::app);
    }

public:
    static Logger* getInstance() {
        if (instance == NULL) {
            instance = new Logger();
        }
        return instance;
    }

    void log(string message) {
        time_t now = time(0);
        char* dt = ctime(&now);
        logFile << dt << ": " << message << endl;
    }
};

Logger* Logger::instance = NULL;

int main() {
    Logger* logger = Logger::getInstance();
    logger->log("Hello World!");
    return 0;
}

        Dans le code ci-dessus, la classe Logger a un constructeur privé et une instance de variable membre statique privée. La fonction getInstance() est une fonction membre statique publique qui renvoie une instance unique de la classe Logger. Si l'instance n'existe pas, une nouvelle instance est créée. La fonction log() est utilisée pour écrire un message dans un fichier journal.

        Dans la fonction principale, nous obtenons d'abord l'instance Logger, puis appelons la fonction log() pour enregistrer le journal. Étant donné que la classe Logger est un mode singleton, une seule instance de Logger existera pendant l'exécution du programme, donc appeler la fonction log() plusieurs fois enregistrera les journaux dans le même fichier.

        Veuillez noter que puisque le modèle singleton peut avoir des problèmes dans un environnement multi-thread, il doit être traité en toute sécurité. Dans cet exemple, nous ignorons le problème de la sécurité des threads et fournissons uniquement une implémentation dans un environnement à un seul thread.

3. Résumé

       Le mode singleton est très dur et solitaire, veuillez bien traiter le mode singleton.

       Passe un bon week-end ma chérie.

Je suppose que tu aimes

Origine blog.csdn.net/weixin_44120785/article/details/129627054
conseillé
Classement