単一モード(singleton)ノット


単一モードクラス規則:
  • このクラスには1つのインスタンスしかありません.単一モードのコア.
  • このクラスは、このインスタンスの作成を担当しています.クラスは、インスタンスが1つしかないことを保証するために、インスタンスを作成します.
  • この例は非プライベートです.インスタンスがプライベートである場合、このクラスはどのクラスにも使用できません.これは意味がありません.

  • 単一モードクラス実装規則:
  • 構造方法プライベート.
  • には、独自のインスタンスを保持できるプライベート静的メンバー変数があります.
  • には、自身のインスタンスを提供することができる共通の静的メンバーメソッドがある.

  • 単例モードを使用する理由:
  • ビジネスの観点から、一部のコアオブジェクトは、従業員が複数、マネージャが1つしかないなど、システムに1つのインスタンスしかない必要があります.
  • テクノロジーの観点から、単一のクラスインスタンスは1回しか作成されず、いくつかの大きなクラスに対してインスタンスを繰り返し作成するのにリソースがかかり、単一のクラスモードを使用するとリソースを節約できます.

  • 単一モード分類:
    餓漢式:クラスロード時にインスタンスを作成します.
    怠け者:クラスが呼び出されたときにインスタンスを作成します.
    比較:
    餓漢式はスレッドが安全で、クラスが作成されると同時にシステムで使用するために静的なオブジェクトが作成され、その後は変更されません.
    怠け者は、インスタンスオブジェクトを作成するときにsynchronizedを付けないと、オブジェクトへのアクセスがスレッドで安全ではありません.1つ目がおすすめです.
    怠け者式にプライベートな構造関数がない実現方式から言えば、彼らの最大の違いは怠け者式が遅延ロードであり、彼は必要なときにオブジェクトを作成し、餓漢式は仮想機が起動するときに作成し、使用する場合は具体的な環境と個人の習慣に基づいているだろう.
    餓漢式はマルチスレッド問題に注目する必要がなく、書き方が簡単明瞭で、使えるなら使う.ただし、クラスをロードするときにインスタンスを作成する(上に友達が書き間違えた)ので、ファクトリモードで多くのインスタンスがキャッシュされている場合は、効率の問題を考慮する必要があります.このクラスがロードされると、すべてのインスタンスをブロックで作成する必要がないためです.怠け者の利点は、遅延ロードであり、同期を使用すべきであるという欠点です.(改善したいなら今でも不可能です.例えばdouble-check)、実は同期せずに、あなたのニーズを見てもいいです.引用のない廃オブジェクトを1、2つ多く作成しても大したことはありません.
     
     
     /**/   /*
     *        Hungry Singleton
     @author ZhangPu
     Feb 22, 2007 7:34:50 PM
      */
    
    public   class  HungrySingleton  {
         /** */ /**           */
         private   static  HungrySingleton hungrySingleton  =   new  HungrySingleton();
         /** */ /**
         *     
          */
         private  HungrySingleton() {}
        
         /** */ /**
         *     
         *  @return
          */
         public   static  HungrySingleton getInstance() {
             return  hungrySingleton;
        }
        
         /** */ /**
         *       
          */
         public   void  demoMethod() {
             // do something
        }
    } 
     
     /**/   /*
     *        Lazy Singleton
     @author ZhangPu
     Feb 22, 2007 7:41:26 PM
      */
    
    public   class  LazySingleton  {
    
         /** */ /**              */
         private   static  LazySingleton lazySingleton  =   null ;
         /** */ /**
         *     
          */
         private  LazySingleton() {}
        
         /** */ /**
         *     
         *  @return
          */
         public   static  LazySingleton getInstance() {
             if (lazySingleton  ==   null ) {
                lazySingleton  =   new  LazySingleton();
            }
             return  lazySingleton;
        }
        
         /** */ /**
         *       
          */
         public   void  demoMethod() {
             // do something
        }
    }