JAVALEの単一例デザインモデルについて


簡単にデザインモードと言えば、問題の進行に効果的な解決方法です。実はそれは思想です。
1.一例の設計モード。
      解決した問題:メモリの中の一つの種類のオブジェクトの一意性を保証することができます。単一のインスタンス)
      単一の例を使ってモードの要求を設計する:複数のプログラムに対して同一の構成情報オブジェクトを使用しなければならない場合、そのオブジェクトの一意性を保証する必要がある。
      どうやって相手の一意性を保証しますか?                                                      解決ステップ:
      1.他のプログラムがnewでオブジェクトを作成することは許されません。                                            1.このような構造関数を私有化する。
      2.クラスでこのクラスのインスタンスを作成します。                                                         2.newによってこのクラスのオブジェクトを作成します。
      3.対外的にオブジェクトを取得できるようにする方法を提供する。                            3.共有する方法を定義し、作成したオブジェクトを返す。

//   (     )
class Single//    ,        。
{
  private static Single s = new Single();
 
  private Single(){}
 
  public static Single getInstance()
  {
    return s;
  }
}
 
 

//   (     ,                           ,      !)
class Single2//     ,    ,     getInstance   ,      。
      //      。 
{
  private static Single2 s = null;
 
  private Single2(){}
 
  public static Single2 getInstance()
  {
    if(s==null)
      s = new Single2();
    return s;
  }
}
 
//   
class SingleDemo
{
  public static void main(String[] args) 
  {
    Single s1 = Single.getInstance();
    Single s2 = Single.getInstance();
 
    System.out.println(s1==s2);
     
//   Single ss = Single.s; //             ,   Single.getInstance();           。
 
  }
}
餓漢式の一例類は自分がロードされた時に自分を具体化します。ブースターが静的であっても、餓漢式の単例類がロードされている時には自分を例化します。資源の利用効率からいうと、これは怠け者タイプの一例類に比べてやや劣る。スピードと反応時間の角度から言えば、怠け者タイプの単例類より少しいいです。
3.登録式:
コード:

package pattern.singleton;import java.util.HashMap;import java.util.Map;
 //      .
 //  Spring     ,     ,         。
public class Singleton3 {
 private static Map<String,Singleton3> map = new HashMap<String,Singleton3>();
 static{
 Singleton3 single = new Singleton3();
 map.put(single.getClass().getName(), single);
 }
 //        
protected Singleton3(){}
 //      ,         
public static Singleton3 getInstance(String name) {
 if(name == null) {
 name = Singleton3.class.getName();
 System.out.println("name == null"+"--->name="+name);
 }
 if(map.get(name) == null) {
 try {
 map.put(name, (Singleton3) Class.forName(name).newInstance());
 } catch (InstantiationException e) {
 e.printStackTrace();
 } catch (IllegalAccessException e) {
 e.printStackTrace();
 } catch (ClassNotFoundException e) {
 e.printStackTrace();
 }
 }
 return map.get(name);
 }
 //          
public String about() {
 return "Hello, I am RegSingleton.";
 }
 public static void main(String[] args) {
 Singleton3 single3 = Singleton3.getInstance(null);
 System.out.println(single3.about());
 }
 }