シングルトンモード
シングルトンとは何ですか?
シングルトン: JAVAのシングルトンデザインパターンを指します。これは、ソフトウェア開発で最も一般的に使用されるデザインパターンの1つです。
このパターンには、単一のオブジェクトのみが作成されるようにしながら、独自のオブジェクトの作成を担当する単一のクラスが含まれます。このクラスは、このクラスのオブジェクトをインスタンス化せずに直接アクセスできる一意のオブジェクトにアクセスする方法を提供します。シングル:ケースのみ:インスタンス
基本知識:
クラス:抽象的な概念である一種の物の定義を
指します。インスタンス:実際の既存の例、物の具体的な個人、または具体的な物を指します。
例:「人」はクラスです。「張さん」は人間の具体例、すなわち具体化です。
プログラミングでも同じことが言えます。まず自分で「クラス」を定義します。それを使用する必要がある場合は、「クラス」の定義を使用して具体的な例を作成します。
クラスの定義を使用してインスタンスを作成することを、クラスのインスタンス化と呼びます。
シングルトンデザインパターン、つまり、特定のクラスのインスタンスオブジェクトを1つだけ取得して、システム全体で使用できるコードパターン
注意:
1.シングルトンクラスは1つのインスタンスのみを持つことができます。
それをどのように呼ぶのですか?コンストラクターの民営化
2.シングルトンクラスは、独自の一意のインスタンスを作成する必要があります。
この一意のインスタンスを保存するための再分類の静的変数が含まれています
3.シングルトンクラスは、このインスタンスを他のすべてのオブジェクトに提供する必要があります。
インスタンスオブジェクトを取得するための外部メソッドを提供します。
(1)直接公開されます
(2)静的変数getメソッドを使用して取得します
例:
1.クラスには校長が1人しかいません。
2. Windowsはマルチプロセス、マルチスレッドです。ファイルを操作する場合、複数のプロセスやスレッドが同時にファイルを操作することは避けられないため、すべてのファイルの処理は単一のインスタンスで実行する必要があります。
3.一部のデバイスマネージャはシングルトンモードとして設計されていることがよくあります。たとえば、コンピュータに2台のプリンタがあり、出力する場合、2台のプリンタが同じファイルを印刷できないことに対処する必要があります。
利点:
1.メモリにはインスタンスが1つしかないため、メモリのオーバーヘッド、特にインスタンスの頻繁な作成と破棄(School of Managementのホームページキャッシュなど)が削減されます。
2.リソースの複数の占有(ファイル書き込み操作など)を避けます。
短所:
インターフェースや継承はなく、単一責任の原則と矛盾します。クラスは内部ロジックのみを考慮し、外部でインスタンス化する方法は考慮しないでください。
いくつかの一般的な形式:
空腹の中国スタイル:スレッドセーフの問題なしにオブジェクトを直接作成します-直接
インスタンス化空腹の中国スタイル(簡潔で直感的)-
列挙(最も簡潔)-
静的コードブロック空腹の中国スタイル(複雑なインスタンス化に適しています)
レイジースタイル:オブジェクトの作成の遅延-安全で
ないスレッド(シングルスレッドに適しています)
-スレッドセーフ(マルチスレッドに適しています)-
静的内部クラスフォーム(マルチスレッドに適しています)
空腹の中国風:
package com.tedu.single;
/**
* 饿汉式:
* 直接创建实例对象,不管你是否需要这个对象,都会创建
*
* 1.构造器私有化 private
* 2.自行创建,并且静态变量保存 static
* 3.向外提供这个实例 public
* 4.强调这是一个单例,我们可以final修饰
*
* 常量我们习惯性的写为大写 INSTANCE
*/
public class Singleton1 {
public static final Singleton1 INSTANCE = new Singleton1();
private Singleton1(){
}
}
取得方法テスト:
package com.tedu.test;
import com.tedu.single.Singleton1;
public class TestSingleton1 {
public static void main(String[] args) {
Singleton1 s = Singleton1.INSTANCE;
System.out.println(s);
}
}
演算結果:
列挙する:
package com.tedu.single;
/**
* 枚举类型:表示该类型的对象是有限的几个
* 我们可以限定为一个,就成了单例
*/
public enum Singleton2 {
INSTANCE;
}
取得方法テスト:
package com.tedu.test;
import com.tedu.single.Singleton2;
public class TestSingleton1 {
public static void main(String[] args) {
Singleton2 s = Singleton2.INSTANCE;
System.out.println(s);
}
}
演算結果:
2つのモードの間に違いはなく、基本的に同じであり、JDK1.5の前と後の違いであることがわかります。
静的コードブロック:
package com.tedu.single;
import com.sun.xml.internal.bind.v2.runtime.unmarshaller.XsiNilLoader;
import java.io.IOException;
import java.util.Properties;
//静态代码块
public class Singleton3 {
public static final Singleton3 INSTANCE;
//什么时候可能会用到这种方法呢?属性需要初始化
private String info;
static {
try {
Properties pro=new Properties();
pro.load(Singleton3.class.getClassLoader().getResourceAsStream("single.properties"));
INSTANCE = new Singleton3(pro.getProperty("info"));
} catch (IOException e) {
e.printStackTrace();
}
}
private Singleton3(String info){
this.info=info;
}
public static Singleton3 getINSTANCE() {
return INSTANCE;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
}
上記は空腹の中国風で書く3つの方法です
怠惰な人間:
package com.tedu.test;
import com.tedu.single.Singleton4;
public class TsetSingleton4 {
public static void main(String[] args) {
Singleton4 s1= Singleton4.getInstance();
Singleton4 s2= Singleton4.getInstance();
System.out.println(s1==s2);
System.out.println(s1);
System.out.println(s2);
}
}
テスト:
package com.tedu.test;
import com.tedu.single.Singleton4;
public class TsetSingleton4 {
public static void main(String[] args) {
Singleton4 s1= Singleton4.getInstance();
Singleton4 s2= Singleton4.getInstance();
System.out.println(s1==s2);
System.out.println(s1);
System.out.println(s2);
}
}
演算結果: