23種類の設計モードC++実現——単例モード


オブジェクト向けのソフトウェア開発では、より高いコード多重性とより合理的なソフトウェア粒度を達成したいと考えています.「設計モード-オブジェクト向けソフトウェアを多重化できる基礎」によると、「関連するオブジェクトを見つけて、適切な粒度でクラスに回帰し、クラスのインタフェースと継承階層を定義し、オブジェクト間の基本関係を確立する必要があります.あなたの設計は手元の問題に対して的確であり、将来の問題と需要に対しても十分な汎用性が必要です.」玄人の設計者は、どんな問題を解決しても最初から始めなければならないわけではないことを知っています.以前に使用したソリューションを多重化したいと考えています.これらの重複モードスキームは、オブジェクト向けの設計がより柔軟で優雅で、最終的な多重性がより良いように、特定の問題を解決します.設計者が新しい設計を従来の作業に基づいて構築し、従来の成功した設計案を多重化するのに役立ちます.これらの設計モデルに詳しい設計者は、それらを発見する必要がなく、すぐに設計問題に適用することができます.このシリーズの主な参考文献は--設計モード、多重化可能なオブジェクト向けソフトウェアの基礎(Design Patterns Elements of Reusable Object-oriented SoftWare Erich.)である.内部コードは基本的にC++言語で書かれています.要約リンク:23種類の設計モードC++実装-概要(インデックス要約)
文書ディレクトリ
  • 要約
  • 主要参加者
  • の利点
  • 実施プロセスと具体的な実装
  • 全体フロー
  • 具体的な実装コード
  • 単例類(Singleton)——怠け者式
  • 単例類(Singleton)——餓漢式
  • 餓漢式と怠け者式の違い
  • 1、スレッドセキュリティ:
  • 2、リソースのロードとパフォーマンス:
  • 補足説明
  • サマリ
    この章では、オブジェクトに1つのインスタンスしか存在しないことを保証し、グローバルにアクセスするインタフェースを提供することを目的とする単一のモードについて説明します.本論文では,怠け者式と餓漢式の2つの例を用いて,単例モードの実現を説明する.この2つの簡単な例でこの設計モデルを理解してほしい.
    主な参加者
    この設計モードの参加者は2つあり、それぞれ:
  • Singletonクラスは、独自のインスタンスを作成し、外部アクセスインタフェースを提供する役割を果たします.
  • Clientユーザー
  • メリット
    この設計モデルの長所については、以下の点を概説し、違いがあれば貴重な意見を提出してください.
  • 一意のインスタンスへのアクセス制御は、単一のインスタンスオブジェクトがグローバルに一意であるため、オブジェクトがどのようにアクセスするか、およびいつアクセスするかを厳格に制御することができる.
  • は、グローバルで唯一のインスタンス変数がソフトウェアの名前空間を汚染することを避けるために、名前空間を減少させる.

  • 実装プロセスと具体的な実装
    全体的なプロセス
  • 単例類は自分を構築する.
  • お客様は、単一のクラスを通じて単一のオブジェクトを取得します.

  • 実装コード
    次に、2つのインスタンスコードを使用して、具体的な実装について説明します.
    単例類(Singleton)——怠け者式
    //Singleton    ,          
    class Singleton
    {
    public:
    	Static Singleton* Instance()
    	{
    		if(m_pSingleton == null)
    		{
    			m_pSingleton = new Singleton();
    		}
    		return m_pSingleton;
    	}
    private:
    	Singleton(){}
    	static Singleton* m_pSingleton;
    }
    

    以上の方法は、インスタンスを初めて取得するときにオブジェクトをインスタンス化しますが、この方法はスレッドが安全ではなく、同時環境で複数の単一のオブジェクトが生成される場合があります.
    pthread_と仮定1 IntanceがNULLであると判断したばかりで、インスタンスを作成する準備をしていたらpthread_に切り替わりました2,pthread_2 intanceがNULLであることも判断し、pthread_を切り取るインスタンスを作成します.1の場合、インスタンスの戻りを作成し続けると、単一のモードの要件を満たすことができなくなります.これは、マルチスレッドアクセスの問題のためです.では、スレッドが原文に同期するようにロックを追加します.https://blog.csdn.net/hj605635529/article/details/70172842
    スレッドのセキュリティを実現するために、1、スレッドロックを追加し、スレッドを同期させる方法
    //                           ,
    //                          。
    #include 
    
    class Singleton
    {
    private:
    	Singleton(){}
     
    	static Singleton* m_pSingleton;
    	boost::mutex m_mutex;
    public:
    	static Singleton* Instance()
    	{
    		m_mutex.lock();
    		if (m_pSingleton == NULL)
    		{
    			m_pSingleton = new Singleton();
    		}
    		m_mutex.unlock();
    		return m_pSingleton;
    	}
    };
    
    Singleton* Singleton::m_pSingleton = NULL;
    

    単例類(Singleton)——餓漢式
    餓漢式単例実装と怠け者式単例実装の違いは、餓漢がクラスの作成時にシステムの使用のために静的オブジェクトを作成したことであり、最初からメモリを占有していたことに相当し、優先場所を使用するかどうかにかかわらず.次に、コードを使用して具体的な実装を説明します.
    class Singleton
    {
    private:
    	Singleton(){}
     
    	static Singleton* m_pSingleton;
    public:
    	static singleton* Instance()
    	{
    		return m_pSingleton;
    	}
    };
    
    Singleton* Singleton::m_pSingleton = new Singleton();
    //               ,         ,            ,
    //                  。
    

    餓漢式と怠け者式の違い
    餓漢はクラスがロードされると、単例の初期化が完了し、Instanceが保証されると、単例はすでに存在し、怠け者はInstanceを呼び出すときだけ、この単例を初期化します.また、次の2つの方法を区別します.
    1、スレッドセキュリティ:
    餓漢式は生まれながらにしてスレッドが安全で、問題なくマルチスレッドに直接使用することができます.怠け者式自体は非スレッドセキュリティであり,スレッドセキュリティを実現するためにいくつかの書き方があるが,本稿では比較的基礎的な方法についてのみ述べた.
    2、リソースのロードとパフォーマンス:
    餓漢式はクラスの作成と同時に静的オブジェクトをインスタンス化し、その後この単一の例を使用するかどうかにかかわらず、一定のメモリを占有しますが、それに応じて、リソースの初期化が完了したため、最初の呼び出しでも速度が速くなります.
    一方、怠け者はロードを遅延し、このクラスを初めて使用したときにオブジェクトをインスタンス化し、最初の呼び出しで初期化し、パフォーマンスに遅延があります.
    補足説明
    本文全体では,単一のモードの怠け者式実装と餓漢式実装について述べ,怠け者式スレッドの安全な実装例も提供した.どのような実装形態においても、単一のインスタンス・モードの最も核心的な考え方は、単一のインスタンス・オブジェクトのグローバル一意性を保証し、外部に一意のオブジェクトにアクセスするインタフェースを提供することである.唯一!唯一!唯一!私たちはいつこのモードを使用しますか?上記のケースに従って類似しているかどうかを分析することができ、類似のニーズがあればカバーすることができます.
    クラスが1つのインスタンスしかなく、このインスタンスがアクセスしやすいことを保証するにはどうすればいいですか?より良い方法は、クラス自身が唯一のインスタンスを保存する責任を負うことです.このクラスは、他のインスタンスが作成されないことを保証し、インスタンスにアクセスする方法を提供します.-Gof 《 Design Pattern 》
    このブログのコードは手書きでコンパイルされていません.Bugがあれば、貴重な意見を提出してください.