第10章セクション1デザインパターン

●一般的なデザインパターンについて教えてください。

参照回答:

(1)シングルトンモード:クラスにインスタンスが1つしかないことを確認し、それにアクセスするためのグローバルアクセスポイントを提供し、グローバルに使用されるクラスの頻繁な作成と破棄を回避し、システムリソースを節約し、プログラムの効率を向上させます。実装:実装されたクラスの構築メソッドをプライベートになるように設計します。このクラスによって参照される静的メンバー変数を追加してインスタンス化します。実装されたクラスにパブリックのCreateInstance関数を提供し、インスタンス化されたクラスを返します。これは、2の静的メンバー変数です。シングルトンモードでは、1つのオブジェクトしか作成できないため、メモリを節約し、オブジェクトへのアクセスを高速化します。適用可能なシナリオ:頻繁にインスタンス化してから破棄する必要があるオブジェクトオブジェクトの作成時に時間やリソースを消費しすぎるが、頻繁に使用されるオブジェクト。ステートフルユーティリティオブジェクト。データベースまたはファイルに頻繁にアクセスするオブジェクト。シナリオの例:各コンピューターには複数のプリンターがありますが、プリンターに同時に出力される2つの印刷ジョブを回避するために1つのPrinterSpoolerのみがあります。WindowsTaskManager(タスクマネージャー)は2つのWindowsタスクマネージャーを開くことができません。Windowsリサイクルビン(リサイクルビン)システム全体の動作中、リサイクルビンは1つのインスタンスのみを維持します。通常、Webサイトのカウンターはシングルトンモードで実装されます。それ以外の場合、同期は困難です。(2)戦略モード:戦略モードは次のとおりです。頻繁に変更される、または将来変更される可能性のあるクラスの部分がインターフェイスとして抽出され、このオブジェクトのインスタンスがクラスに含まれるため、クラスのインスタンスは、実行時にこのインターフェイスを実装するクラスの動作を自由に呼び出すことができます。実装方法:パブリックインターフェイスまたは抽象クラスを提供し、使用する戦略方法を定義します。(戦略抽象クラス)複数の実装戦略抽象クラスの実装クラス。(戦略実施クラス)複数の実装クラスをカプセル化し、インターフェイスタイプのメンバーを提供し、クライアントで切り替えることができる環境クラス。クライアントは環境クラスを呼び出して、異なる戦略を切り替えます。クラス図:画像戦略:一連の特定の戦略アルゴリズムを制約するために使用される戦略インターフェース。コンテキストはこのインターフェイスを使用して、特定の戦略を呼び出し、定義された戦略を実装します。ConcreteStrategy:特定の戦略の実装、つまり特定のアルゴリズムの実装。コンテキスト:特定の戦略との対話を担当するコンテキスト。通常、コンテキストは実際の戦略の実装を保持します。該当するシナリオ:システムに多くのクラスがあり、それらの違いが動作のみにある場合、戦略モードを使用すると、オブジェクトに多くの動作から1つの動作を動的に選択させることができます。システムは、いくつかのアルゴリズムの1つを動的に選択する必要があります。クラスは複数の動作を定義し、これらの動作は、このクラスの操作で複数の条件付きステートメントの形式で表示されます。関連する条件付きブランチをそれぞれのStrategyクラスに移動して、これらの条件付きステートメントを置き換えます。(3)単純なファクトリパターン:オブジェクトを作成するためのインターフェイスまたは抽象クラスを定義し、サブクラスにインスタンス化するクラスを決定させます。ファクトリメソッドは、クラスのサブクラスへのインスタンス化を遅らせます。クラス図:画像実装:作成されたすべてのオブジェクトの親クラスであり、すべてのインスタンスに共通の共通インターフェイスを記述する責任がある抽象製品クラス(Product)。複数の具体的な製品クラス(Concrete Product)。特定の製品の役割は作成の目標です。作成されたすべてのオブジェクトは、この役割の特定のクラスのインスタンスとして機能します。ファクトリクラス(作成者)は、すべてのインスタンス作成するための内部ロジックを実装する責任があります。適用可能なシナリオ:複雑なオブジェクトを生成する必要がある場合は常に、ファクトリメソッドパターンを使用できます。システムのスケーラビリティを向上させる必要がある場合は、ファクトリモデルを検討し、さまざまな製品をさまざまな実装工場で組み立てることができます。(4)装飾モード:サブクラスを作成せずにオブジェクトの機能を拡張するために、構造を変更せずに既存のオブジェクトに新しい機能を追加できます。クラス図:画像実装:抽象コンポーネント(コンポーネント)役割:追加の責任を受け取る準備ができているオブジェクトを標準化するための抽象インターフェースを提供します。具体的なコンポーネント(ConcreteComponent)の役割:追加の責任を受け取るクラスを定義します。デコレータの役割:Componentオブジェクトのインスタンスを保持し、抽象コンポーネントインターフェイスと整合性のあるインターフェイスを定義します。コンクリートデコレータ(ConcreteDecorator)の役割:コンポーネントオブジェクトに追加の責任を「固定」する責任があります。該当するシナリオ:クラスの機能を拡張します。動的増加機能、動的キャンセル。(5)オブザーバーモード:オブジェクト間の1対多の依存関係。オブジェクトの状態が変化すると、それに依存するすべてのオブジェクトに通知され、自動的に更新されます。クラス図:画像抽象サブジェクト(サブジェクト)ロール:オブザーバーオブジェクトへのすべての参照はコレクションに格納されます。各抽象サブジェクトロールは、任意の数のオブザーバーを持つことができます。抽象テーマは、オブザーバーの役割を追加および削除するためのインターフェイスを提供します。通常、抽象クラスとインターフェイスを使用して実装されます。抽象オブザーバー(オブザーバー)の役割:すべての特定のオブザーバーのインターフェイスを定義し、サブジェクトから通知されたときに自分自身を更新します。具体的な件名(ConcreteSubject)の役割:具体的な件名の内部状態が変化した場合は、登録されているすべてのオブザーバーに通知してください。特定のテーマの役割は通常、サブクラスによって実装されます。具体的なオブザーバー(ConcreteObserver)の役割:この役割は、抽象オブザーバーの役割がサブジェクトの状態とその状態を調整するために必要な更新インターフェイスを実装します。通常、サブクラスで実装されます。必要に応じて、特定のオブザーバーロールは、特定のサブジェクトロールへの参照を保存できます。該当するシナリオ:抽象モデルに2つの側面がある場合、一方の側面が他方に依存します。2つを別々のオブジェクトにカプセル化して、個別に変更および再利用できるようにします。オブジェクトへの変更が他のオブジェクトを同時に変更する必要がある場合、変更する必要のあるオブジェクトの数はわかりません。オブジェクトが他のオブジェクトに通知する必要がある場合、他のオブジェクトが誰であるかを想定することはできません。つまり、これらのオブジェクトを緊密に結合する必要はありません。

●シングルトンモードは手書きで書いてください

参照回答:

1.空腹の男モード

public class Singleton {private static Singleton instance = new Singleton(); private Singleton(){} public static Singleton getInstance(){return instance;}}
このように、クラスがロードされると初期化が完了するため、クラスのロードは遅くなりますが、オブジェクトを取得する速度は速くなります。このメソッドは、マルチスレッド同期の問題を回避するためのクラスロードメカニズムに基づいていますが、クラスロードにつながる他の方法(または他の静的メソッド)があるかどうかは定かではありません。現時点では、インスタンスを初期化しても、レイジーロードの効果は明ら​​かに得られません。 2.スラッカーモード(スレッドは安全ではありません)
public class Singleton {private static Singleton instance; private Singleton(){} public static Singleton getInstance(){if(instance == null){instance = new Singleton();} return instance;}}
レイジーマンモードは、静的オブジェクトがユーザーが初めて呼び出すときに初期化されることを確認します。リソースは節約できますが、最初にロードするときにインスタンス化する必要があります。応答は少し遅く、複数のスレッドでは正常に機能しません。 3.スラッカーモード(スレッドの安全性)
public class Singleton {private static Singleton instance; private Singleton(){} public static synchronized Singleton getInstance(){if(instance == null){instance = new Singleton();} return instance;}}
この書き込みメソッドは複数のスレッドでうまく機能しますが、getInstanceメソッドが呼び出されるたびに同期する必要があるため、不要な同期オーバーヘッドが発生し、ほとんどの場合、同期は必要ないため、これを使用することはお勧めしません。モード。 4.ダブルチェックモード(DCL)
public class Singleton {private volatile static Singleton singleton; private Singleton(){} public static Singleton getInstance(){if(instance == null){synchronized(Singleton.class){if(instance == null){instance = new Singleton ();}}} returnシングルトン;}}
このように、getSingletonメソッドでシングルトンを2回判定します。1回目は不要な同期、2回目はシングルトンがnullの場合のインスタンス作成です。

●デザインパターンは?

参照回答:

设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理地运用设计模式可以完美地解决很多问题,每种模式在现实中都有相应的原理来与之对应,每种模式都描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是设计模式能被广泛应用的原因。

● 请你手写一下单例模式代码

参考回答:

懒汉式单例模式:延迟实例化,但节省空间package com.sxh.singleton;public class SingleTon {/** volatile关键字确保:当uniqueInstance变量被初始化为SingleTon实例时,多个线程能正确的处理uniqueInstance变量* 分析:volatile修饰的成员变量,在每次被线程访问时,都强制性的从共享内存重读该成员的值;* 当值发生变化是,强制线程将变化值写入共享内存,任何时候不同线程总是看到你某个成员变量的同一个值* */private volatile static SingleTon uniqueInstance;//利用一个静态变量来记录SingleTon类的唯一实例//其他有用的单件类的数据
private SingleTon(){} //类外无法访问public  static SingleTon getInstance(){/** 使用”双重检查加锁“,在getInstance中减少使用同步* 首先检查是否实例已经创建了,如果尚未创建,才进行同步;只有第一次访问getInstance会同步*/if(uniqueInstance==null){  //确保只有一个实例synchronized (SingleTon.class) { //多线程的情况不会出现问题,线程同步问题if(uniqueInstance==null){uniqueInstance=new SingleTon();//如果我们不需要这个实例,则永远不会产生}}}return uniqueInstance;}//其他有用的单件类的方法,单件类也可以是一般的类,具有一般的数据和方法
}饿汉式单例模式:急切的创建实例,而不用延迟实例化
package com.sxh.singleton;public class SingleTon {
private volatile static SingleTon uniqueInstance=new SingleTon();//其他有用的单件类的数据
private SingleTon(){} //类外无法访问public  static SingleTon getInstance(){return uniqueInstance;}//其他有用的单件类的方法,单件类也可以是一般的类,具有一般的数据和方法
}IoDH实现单例模式
package com.sxh.singleton;public class SingleTon {
private SingleTon(){} //类外无法访问private static class HolderClass{ //静态内部类private static final SingleTon uniqueinstance = new SingleTon(); } public static SingleTon getInstance(){ return HolderClass.uniqueinstance; } //その他の便利なシングルトンクラスメソッド、シングルトンクラスは一般的なデータを持つ一般的なクラスにすることもできますそして方法

画像


おすすめ

転載: blog.51cto.com/15065850/2581367