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を返す。