デザインパターン一言メモ

Adapter

IAdapterがAdapteeに委譲。

継承で実現する場合もある。

Prototype

IPrototypeが自身を複製。

Memento

OriginatorがMementoを作成、復元。

State/Strategy

IState/IStrategyでポリモーフィズム。

具体的にはclientからIState/IStrategyを利用し、インスタンスもclient内で生成することが多い。
インスタンス生成時に条件分岐等でアルゴリズムの切替え、状態の切替えを実施。

Decorator

IComponentを共通で実装。
ConcreateComponentからDecoratorに処理を委譲。

Composite

IComponentを共通で実装。
CompositeとLeafがある。
CompsiteがIComponentのコレクションを保持。

Proxy

ISubjectを共通で実装。
Proxyが自分で処理をすることも必要ならRealSubjectに処理を委譲することもできる。

Flyweight

FlyweightFactoryでFlyweigthインスタンスを生成し自身のpoolコレクションに保存。
利用時も既にインスタンスが存在すれば、それを利用する。

Singleton

コンストラクタをprivateにする。
自身のstaticメンバーにインスタンスを保存

Iterator

IIteratorにIAggregateのコレクションを保持する。
IAggregateでIIteratorのインスタンス生成して利用する。

Template Method

テンプレートメソッドはabstractメソッドのみ使う。
サブクラスでabstractメソッドを実装。
スーパークラスがサブクラスをコントロール。

Builder

DirectorはIBuilderで定義したメソッドのみ使う。
DirectorがBuilderをコントロール。

Factory Method

Template Methodと同じ構造。
インスタンス生成が必要な部分をサブクラスで実装。

Factory抽象クラスの中で実装したcreateで抽象createProductなどインスタンス生成の手順を定義し、サブクラスでcreateProductを実装する。

インスタンス生成のコントロールを得るという点から下記のような方法が有名。
(Factory Methodをパラメータ化)

Class Test {
Test(int type){
_type = type;
}
}

Class Test{
private Test(int type){ //コンストラクタをprivate
_type = type;
}
static create(int type){ //インスタンス生成メソッドを準備
return new Test(type);
}
}

Abstract Factory

IFactoryでIProduct1,IProduct2の生成を定義。
どのような部品セット(1,2)なのかをIFactoryで定義し、IProductでそれぞれの処理を定義。

Bridge

継承と実装を分離。
機能追加は、Abstractionを継承したRefinedAbstractionに。
実装は、Abstractionより委譲されたImplementorに。

Visitor

IVisitorはデータ構造ごとのvisitを実装する。
IAcceptorのacceptの中でvisitを呼び、自身をvisitに渡す。
ダブルディパッチ。

Chain of Responsibility

IHandlerは転送先のIHandlerを自身に持ち
処理が完了か次が見つからないとき以外は次に転送し続ける。

Facade

サブシステム化し、単純な窓口を提供。

Mediator

IMediatorでIColleaugeを生成しメンバーとして保持、さらにIColleauge.SetMediatorで自身を渡す。
IColleaugeは自身に変更があったらIMediator.ColleagueChangedでIMediatorに通知。
IMediatorはColleagueChangedが呼ばれたとき、保持するIColleaugeすべての状態からロジックを判断する。

Observer

ISubjectがIObserverを保持しISubjectが変化したらIObserver.Updateを呼ぶ。
被験者が観察者のインスタンスを保持する。

Command

処理の呼び出しをメッセージからオブジェクトにする。

ICommandはExecuteを定義し、Receiverを保持。
Receiverは実際のActionを定義しICommand.Excuteの中でReceiver.Actionを呼ぶ。
Invokerは起動者でボタンのようなイメージ。

Interpreter

独自構文の文字列をContextに渡しトークン解析する。
ContextはhasNextやnextTokenなどで解析したトークンを取得できる。

構文解析クラスは文法ごとにIAbstractExpression実装した
TerminalExpression、NonterminalExpressionを準備。
NonterminalExpression1、NonterminalExpression2、TerminalExpression
のようにそれぞれ作成する。

実際は、
NonterminalExpression1.Parse(new Context(文字列))のように渡されると、
NonterminalExpression1の内部でnew NonterminalExpression2.Parse(context)
のように最後のTerminalExpressionまで内部で呼ぶ。

Null Object

IAbstractionをRealObjectとNullObjectが実装。
IAbstraction.Request()でRealObjectを返すが、Request()がNullを返す場合はNullObjectを返す。