シングルトンシンプルインスタンスデザインパターン分析
序文
今日は、Android Development -Singleton Modeで最も一般的に使用されているデザインパターンの包括的な要約をお知らせします。
デザインパターンの紹介については、私が以前に書いたことを読むことができます:「デザインパターン」を完全に理解するために1分
目次
1。紹介
1.1問題が解決する問題
前述のように、設計パターン=特定のタイプの特定の問題の解決策であるため、シングルトンパターンはどのような問題ですか?
意味:Singleton =インスタンス。
問題解決:オブジェクト間の結合を減らします
解決策:シングルトンパターン、つまり、クラスには1つのインスタンス化されたオブジェクトのみがあり、グローバルアクセスポイントを提供することを実装する
1.2インスタンスの紹介
次に、インスタンスを使用してシングルトンパターンを紹介します
背景:Xiaochengにはプラスチック工場がありますが、内部には1つの倉庫しかありません。
目的:コードを使用して倉庫管理を実装したい
現在の慣行:倉庫と労働者を確立します
その中で、倉庫の数量=商品の量。労働者には、移動(int i)および移動(int i)の処理方法があります。
問題:テストを通じて、労働者が移動するたびに、新しい倉庫が建設される、つまり商品が同じ倉庫に配置されないことがわかりました。どうしたの? (以下のコードを参照)
パッケージscut.designmodel.singletonpattern; // warehouse class class Storehouse {private int Quantion = 100; public void setquantity(int Quantion){this.quantity = Quantion; } public int getQuantity(){return Quantion; }} // Walking Human Class Carrier {public Storehouse mstorehouse;パブリックキャリア(Storehouse Storehouse){mstorehouse = Storehouse; } //商品を倉庫に移動する公共void movein(int i){mstorehouse.setquantity(mstorehouse.getquantity()+i); } //ウェアハウスから移動する公開void moveout(int i){mstorehouse.setquantity(mstorehouse.getquantity() - i); }} //ワーカーハンドリングテストpublic class singlepattern {public static void main(string [] args){storehouse mstorehouse1 = new Storehouse(); Storehouse mstorehouse2 = new Storehouse(); Carrier Carrier1 = New Carrier(MSTOREHOUSE1); Carrier Carrier2 = New Carrier(MSTorehouse2); System.out.println( "2つは同じですか?"); if(mstorehouse1.equals(mstorehouse2)){// ==シンボルの代わりにここで等しいものを使用します。==シンボルは、2つのオブジェクトsystem.out.println( "is" is ")のアドレスを比較するためです。 } else {system.out.println( "ISは同じではありません"); } //ポーターが商品を移動した後、倉庫Carrier1.Movein(30)の商品の量を報告します。 System.out.println( "倉庫製品マージン:"+carrier1.mstorehouse.getQuantity()); carrier2.moveout(50); System.out.println( "倉庫製品マージン:"+carrier2.mstorehouse.getQuantity()); }}結果:
2つは同じですか?同じ倉庫の製品マージン:130倉庫製品マージン:50
2。シングルトンパターンの紹介
2.1解決された問題(アプリケーションシナリオ)
紛争:上記の結果から、労働者は明らかに同じ倉庫インスタンスではないことが明らかになったことがわかります。
目標:すべての労働者が同じ倉庫インスタンスを運営しています
シングルトンパターンは、このタイプの問題の解決策です。インスタンス化されたオブジェクトが1つだけでクラスを実装し、グローバルアクセスポイント2.2作業原則を提供します
Javaでは、オブジェクトを使用してこれらのクラスを操作します(クラスインスタンス化後)。クラスインスタンス化は、コンストラクターを介して実行されます。クラスには1つのインスタンス化されたオブジェクトしかないことを実装したい場合は、クラスのコンストラクターで作業する必要があります。
シングルトンモードの一般的な実装:(使用手順を含む)
パブリッククラスシングルトン{// 1。プライベート変数の作成(シングルトンの一意のインスタンスを記録するために使用)// 2を作成します。インスタンスインテストインテリアでは、内部的な静的シングルトンofusinstance = new Singleton(); // 3。クラスのコンストラクターを民営化し、プライベートシングルトン(){} // 4をインスタンス化するための外部呼び出しを防ぎます。クラス// 5にグローバルなユニークなアクセスポイントを提供するパブリック方法を定義します。 getInstance()メソッドを呼び出すことにより、一意のインスタンスを外部的に返します。 }}OK、シングルトンパターンの紹介と原則を理解する必要がありますよね?それでは、Xiaochengの上に現れた「倉庫は同じではない」という問題を解決しましょう!
2.3例の紹介
Xiaochengはシングルトンモードを使用して、上記の例のコードを改善します。
パッケージscut.designmodel.singletonpattern;インポートjava.util.concurrent.locks.lock; import java.util.concurrent.locks.reentrantlock; // singleton warehouse Class Storehouse {//ウェアハウス製品の数量private int = 100; // Instantiate Private Static Storehouse ourinstance = new Storehouse();; //外部にgetInstance()メソッドを呼び出して、一意のインスタンスを返すようにします。 public static Storehouse getInstance(){return ourinstance; } //閉じたコンストラクターPrivate Storehouse(){} public void setquantity(int Quantion){this.quantity = omants; } public int getQuantity(){return Quantion; }} // Carrier Man Class Carrier {Public Storehouse Mstorehouse;パブリックキャリア(Storehouse Storehouse){mstorehouse = Storehouse; } //商品を倉庫に移動する公共void movein(int i){mstorehouse.setquantity(mstorehouse.getquantity()+i); } //ウェアハウスから移動する公開void moveout(int i){mstorehouse.setquantity(mstorehouse.getquantity() - i); }} //ワーカーハンドリングテストpublic class singlepattern {public static void main(string [] args){storehouse mstorehouse1 = storehouse.getinstance(); streehouse mstorehouse2 = storehouse.getInstance(); Carrier Carrier1 = New Carrier(MSTOREHOUSE1); Carrier Carrier2 = New Carrier(MSTorehouse2); System.out.println( "2つは同じですか?"); if(mstorehouse1.equals(mstorehouse2)){system.out.println( "is same"); } else {system.out.println( "not the Same"); } //ポーターが商品を移動した後、倉庫の商品の量を報告します。 System.out.println( "倉庫製品マージン:"+carrier1.mstorehouse.getQuantity()); carrier2.moveout(50); System.out.println( "倉庫製品マージン:"+carrier2.mstorehouse.getQuantity()); }}結果:
2つは同じですか?同じ倉庫商品マージン:130倉庫商品マージン:80
結果分析によると、Singletonモデルを使用した後、Warehouseクラスには倉庫インスタンスが1つしかありません。ポーターが間違った倉庫に入ることを心配する必要はありません。 ! !
2.4利点
2.5短所
3。シングルトンモードの実装
3.1一般的な状況
Hungry Style(最もシンプルなシングルトン実装方法)
クラスSingleton {private static Singleton OurinStance = new Singleton(); private singleton(){} public static singleton newInstance(){return ourinstance; }}アプリケーションシナリオ:
怠zyなスタイル
怠zyと空腹の最大の違いは、シングルトンの初期化操作のタイミングです。
クラスSingleton {private static Singleton ourinstance = null; private singleton(){} public static singleton newInstance(){if(ourinstance == null){ourinstance = new Singleton(); } noturinStanceを返します。 }}アプリケーションシナリオ:
3.2マルチスレッドの下でのシングルトンモードの実装
マルチスレッドの場合:
ソリューション1:ロックを同期します
同期ロック同期(singleton.class)を使用して、複数のスレッドが同時に入力されないようにし、インスタンスが複数回インスタンスになります。
クラスSingleton {private static Singleton ourinstance = null; private singleton(){} public static singleton newInstance(){synchronized(singleton.class){if(ourinstance == null){ourinstance = new Singleton(); }} return ousinstance; }}ソリューション2:ロックを再確認します
同期ロック(同期(Singleton.class)を除く)に基づいてIFのレイヤーが追加され、インスタンスがインスタンスをインスタンスし、次に入力したときにパフォーマンスを向上させることで、同期(Singleton.class)を実行してオブジェクトロックを取得し、パフォーマンスを向上させる必要はありません。
クラスSingleton {private static Singleton ourinstance = null; private singleton(){} public static singleton newInstance(){if(ourinstance == null){synchronized(singleton.class){if(owninstance == null){ourinstance = new singleton(); }}} return ourinstance; }}ソリューション3:静的インナークラス
JVMクラスがロードされると、データが同期することが保証されます。内部クラスの実装:内部クラスでオブジェクトインスタンスを作成します。
アプリケーションが内部クラスJVMを使用しない限り、Singletonクラスはロードされず、Singletonオブジェクトは作成されないため、「怠zyな」怠zyなロードとスレッドの安全性が達成されます。
クラスシングルトン{//シングルトンオブジェクトは、内部クラスがプライベート静的クラスSingleton2にロードされている場合にのみ作成されます。 } private singleton(){} public static singleton newinstance(){return singleton2.ourinstance; }}ソリューション4:タイプを列挙します
最もシンプルで使いやすいシングルトン実装方法(「効果的なJava」が推奨)
Public Enum Singleton {// Singletonインスタンスのインスタンスである列挙要素を定義します。 public void dosomething(){}}それを使用する方法は次のとおりです。
Singleton Singleton = singleton.instance; singleton.dosomething();
5。概要
この記事では、主に、原則と実装方法を含むシングルトンモデルを紹介します。次に、他の設計モデルについて説明し続けます。興味があれば、それに注意を払い続けることができます。
読んでくれてありがとう、私はそれがあなたを助けることができることを願っています。このサイトへのご支援ありがとうございます!