Heim  >  Artikel  >  Java  >  Detaillierte Erläuterung von Beispielen für Java-Singleton-Muster

Detaillierte Erläuterung von Beispielen für Java-Singleton-Muster

黄舟
黄舟Original
2017-10-16 10:34:261159Durchsuche

Dieser Artikel enthält hauptsächlich relevante Informationen zur detaillierten Erläuterung von Beispielen für den Java-Singleton-Modus. Ich hoffe, dass dieser Artikel jedem helfen kann, diesen Teil des Inhalts gründlich zu verstehen und zu beherrschen

Java Singleton Detaillierte Erläuterung von Beispielmustern

Konzept:   

Das Singleton-Muster in Java ist ein gängiges Designmuster Drei Arten von Singleton-Mustern: Es gibt drei Arten: Singleton im Lazy-Stil, Singleton im Hungrig-Stil und Singleton im Registrierungs-Stil. ​

Der Singleton-Modus hat die folgenden Eigenschaften:

 1. Eine Singleton-Klasse kann nur eine Instanz haben.
2. Die Singleton-Klasse muss ihre eigene eindeutige Instanz erstellen.
 3. Die Singleton-Klasse muss diese Instanz allen anderen Objekten bereitstellen.

Das Singleton-Muster stellt sicher, dass eine Klasse nur eine Instanz hat, sich selbst instanziiert und diese Instanz dem gesamten System zur Verfügung stellt. In Computersystemen werden Thread-Pools, Caches, Protokollobjekte, Dialogfelder, Drucker und Grafikkartentreiberobjekte häufig als Singletons konzipiert. Diese Anwendungen verfügen alle mehr oder weniger über die Funktionalität von Ressourcenmanagern. Jeder Computer kann über mehrere Drucker verfügen, es kann jedoch nur ein Druckerspooler vorhanden sein, um zu verhindern, dass zwei Druckaufträge gleichzeitig auf dem Drucker ausgegeben werden. Jeder Computer kann über mehrere Kommunikationsanschlüsse verfügen. Das System sollte diese Kommunikationsanschlüsse zentral verwalten, um zu verhindern, dass ein Kommunikationsanschluss gleichzeitig von zwei Anforderungen aufgerufen wird. Kurz gesagt besteht der Zweck der Wahl des Singleton-Modus darin, inkonsistente Zustände und langfristige Richtlinien zu vermeiden.

Schauen wir uns zunächst eine klassische Singleton-Implementierung an.


public class Singleton {
  private static Singleton uniqueInstance = null;

  private Singleton() {
    // Exists only to defeat instantiation.
  }

  public static Singleton getInstance() {
    if (uniqueInstance == null) {
      uniqueInstance = new Singleton();
    }
    return uniqueInstance;
  }
  // Other methods...
}

Singleton verhindert, dass die Klasse extern instanziiert wird, indem der Konstruktor auf privat beschränkt wird. Innerhalb desselben virtuellen Maschinenbereichs kann die einzige Instanz von Singleton nur getInstance( übergeben. ) Methodenzugriff. (Tatsächlich ist es möglich, eine Klasse mit einem privaten Konstruktor über den Java-Reflexionsmechanismus zu instanziieren, wodurch grundsätzlich alle Java-Singleton-Implementierungen ungültig werden. Dieses Problem wird hier nicht besprochen. Nehmen wir an, dass der Reflexionsmechanismus nicht existiert. . )

Aber die obige Implementierung berücksichtigt keine Thread-Sicherheitsprobleme. Die sogenannte Thread-Sicherheit bedeutet: Wenn in dem Prozess, in dem sich Ihr Code befindet, mehrere Threads gleichzeitig laufen, können diese Threads diesen Code gleichzeitig ausführen. Wenn die Ergebnisse jedes Laufs mit denen von Single-Thread-Läufen übereinstimmen und die Werte anderer Variablen mit den Erwartungen übereinstimmen, ist dies Thread-sicher. Mit anderen Worten: Die von einer Klasse oder einem Programm bereitgestellte Schnittstelle ist eine atomare Operation für Threads oder das Umschalten zwischen mehreren Threads führt nicht zu Mehrdeutigkeiten in den Ausführungsergebnissen der Schnittstelle, was bedeutet, dass wir keine Synchronisationsprobleme berücksichtigen müssen. Offensichtlich erfüllt die obige Implementierung nicht die Anforderungen der Thread-Sicherheit, und es ist wahrscheinlich, dass mehrere Singleton-Instanzen in einer gleichzeitigen Umgebung angezeigt werden.


public class TestStream {
  private String name;
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  } 
  //该类只能有一个实例
  private TestStream(){}  //私有无参构造方法
  //该类必须自行创建
  //有2种方式
  /*private static final TestStream ts=new TestStream();*/
  private static TestStream ts1=null;
  //这个类必须自动向整个系统提供这个实例对象
  public static TestStream getTest(){
    if(ts1==null){
      ts1=new TestStream();
    }
    return ts1;
  }
  public void getInfo(){
    System.out.println("output message "+name);
  }
}
/**
 * 
 */
public class TestMain {
  public static void main(String [] args){
    TestStream s=TestStream.getTest();
    s.setName("张孝祥");
    System.out.println(s.getName());
    TestStream s1=TestStream.getTest();
    s1.setName("张孝祥");
    System.out.println(s1.getName());
    s.getInfo();
    s1.getInfo();
    if(s==s1){
      System.out.println("创建的是同一个实例");
    }else if(s!=s1){
      System.out.println("创建的不是同一个实例");
    }else{
      System.out.println("application error");
    }
  }
}

Laufergebnisse:


张孝祥
张孝祥
output message 张孝祥
output message 张孝祥
创建的是同一个实例

Fazit: Aus den Ergebnissen , wir können Es ist bekannt, dass das Singleton-Muster einer objektorientierten Anwendung den einzigen Zugriffspunkt auf ein Objekt bietet. Unabhängig davon, welche Funktion es implementiert, teilt die gesamte Anwendung ein Instanzobjekt.

1. Hungriger Singleton-Kurs im chinesischen Stil


//饿汉式单例类.在类初始化时,已经自行实例化 
public class Singleton1 {
  //私有的默认构造子
  private Singleton1() {}
  //已经自行实例化 
  private static final Singleton1 single = new Singleton1();
  //静态工厂方法 
  public static Singleton1 getInstance() {
    return single;
  }
}

2. Fauler Singleton-Kurs im chinesischen Stil


//懒汉式单例类.在第一次调用的时候实例化 
public class Singleton2 {
  //私有的默认构造子
  private Singleton2() {}
  //注意,这里没有final  
  private static Singleton2 single=null;
  //静态工厂方法 
  public synchronized static Singleton2 getInstance() {
     if (single == null) { 
       single = new Singleton2();
     } 
    return single;
  }
}

3. Registrierte Singleton-Klasse


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());
  }
}

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung von Beispielen für Java-Singleton-Muster. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn