はじめに
デザインパターンとは?
創造ベース
- ファクトリーパターンと抽象ファクトリーパターン
- シングルトンパターン
- Builder パターン
- プロトタイプパターン
構造的
- アダプタパターン
- デコレータパターン
- ブリッジングパターン
- 出現パターン
- プロキシパターン
- フィルタパターン
- 組み合わせパターン
- ヘドニックパターン
行動的
- 責任の連鎖パターン
- オブザーバーパターン
- テンプレートパターン
- コマンドパターン
- インタープリターパターン
- イテレータパターン
- 中間パターン
- 戦略パターン
- ステートフルなパターン
- メモパターン
- 空のオブジェクトパターン
JDKのクラス・ライブラリでよく使われるデザイン・パターンとは?
- ファクトリーパターン
- アダプタパターン
- プロキシパターン
- シングルトンパターン
- デコレータ
- テンプレートメソッドパターン
Springではどのようなデザインパターンが使われていますか?
- プロキシパターン:AOPで使用
- シングルトンモード: Beanはデフォルトでシングルトンです。
- テンプレートメソッドパターン:jdbcTemplate
- ファクトリーパターン: BeanFactory
- 例えば、ContextStartedEventはApplicationContextの起動時にトリガーされるイベントです。
- Adapter Pattern: Spring MVCもAdapterパターンを使ってコントローラを適応させます。
Javaのシングルインスタンスデザインパターンとはどういう意味ですか?Javaでスレッドセーフなシングルトンパターンを書いてください
シングルトンパターンは、システム全体で、作成にリソースを必要とする多くのオブジェクトを共有することに重点を置いています。特定のクラスのインスタンスはアプリケーション全体で1つだけ維持され、すべてのコンポーネントで共通に使用されます。java.lang.Runtimeはシングルトンパターンの典型的な例です。
静的な内部クラス:JVMは同期制御機能を提供します。静的な最終クラスで、クラス・ロードにJVMを使用し、データの同期を確保します。オブジェクトのインスタンスは内部クラスで作成され、アプリケーションが内部クラスを使用しない限り、JVMはわざわざクラスをロードせず、作成されるシングルトンオブジェクトは作成されません。
public class StaticInnerSingleton {
private StaticInnerSingleton(){
}
/**
* StaticInnerSingletonが最初にロードされるとき、インスタンスは初期化されない。,
* JVMはStaticInnerSingletonをロードし、getInstanceメソッドが初めて呼ばれたときだけインスタンスを初期化する。
* @return
*/
public static StaticInnerSingleton getInstance(){
return SingletonHolder.instance;
}
//静的内部クラス
private static class SingletonHolder{
private static final StaticInnerSingleton instance = new StaticInnerSingleton();
}
}
長所:スレッドセーフを保証するJVM独自のメカニズム、パフォーマンス上の欠陥がないこと。
列挙:
public enum EnumSingleton {
//Singletonのインスタンスである列挙の要素を定義する
INSTANCE;
public void doSomething(){
}
}
注意:列挙クラスに他のインスタンス・メソッドやインスタンス変数がある場合、それらがスレッドセーフであることを確認する必要があります。
ファクトリーパターンを使用する最も重要な利点は何ですか?ファクトリーパターンはどこで使われるのですか?
ファクトリーパターンの最大の利点は、オブジェクトを作成する際にカプセル化のレベルが追加されることです。ファクトリーを使用してオブジェクトを作成すると、後で元の製品の実装やクラスをより高レベルで高性能な実装に置き換えることができます。
オブザーバー・デザイン・パターンとは?オブザーバーデザインパターンを実装します。
オブザーバー・パターンは、オブジェクト間の一対多の依存関係を定義し、オブジェクトの状態が変更されるたびに、その依存オブジェクトに通知が送られ、自動的に更新されるようにします。オブザーバー・パターンは、パブリッシュ・サブスクライブ・パターン、モデル・ビュー・パターン、ソース・リスナー・パターン、フォロワー・パターンとしても知られています。
Observerパターンは、表現層とデータロジック層の分離を達成することができ、安定したメッセージの更新配信メカニズムを定義し、更新インターフェイスを抽象化し、特定のオブザーバの役割として、多種多様な異なる表現層を持つことが可能になります;Observerパターンは、観測対象とオブザーバの間の抽象的な結合を確立します;Observerパターンは、ブロードキャスト通信をサポートしています;Observerパターンは、オープンとクローズの原則の要件に準拠しています。
もしオブザーバとオブザーバターゲットの間に循環的な依存関係がある場合、オブザーバターゲットはそれらの間で循環的な呼び出しを引き起こし、システムクラッシュにつながる可能性があります。観測対象がどのように変化したかを観測者に知らせる仕組みはありません。
public class Subject {
private List<Observer> observers
= new ArrayList<Observer>();
private int state;
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
notifyAllObservers();
}
public void attach(Observer observer){
observers.add(observer);
}
public void notifyAllObservers(){
for (Observer observer : observers) {
observer.update();
}
}
}
public abstract class Observer {
protected Subject subject;
public abstract void update();
}
public class BinaryObserver extends Observer{
public BinaryObserver(Subject subject){
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println( "Binary String: "
+ Integer.toBinaryString( subject.getState() ) );
}
}
public class OctalObserver extends Observer{
public OctalObserver(Subject subject){
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println( "Octal String: "
+ Integer.toOctalString( subject.getState() ) );
}
}
public class HexaObserver extends Observer{
public HexaObserver(Subject subject){
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println( "Hex String: "
+ Integer.toHexString( subject.getState() ).toUpperCase() );
}
}
public class ObserverPattern {
public static void main(String[] args) {
Subject subject = new Subject();
new HexaObserver(subject);
new OctalObserver(subject);
new BinaryObserver(subject);
System.out.println("First state change: 15");
subject.setState(15);
System.out.println("Second state change: 10");
subject.setState(10);
}
}