GoFの23パターンについて
[RubyでGoFデザインパターンの適応]
(http://www.nulab.co.jp/designPatterns/designPatterns1/designPatterns1-2.html)
[Java言語で学ぶデザインパターン入門 ]
(https://www.amazon.co.jp/dp/4797316462)
[【初心者向け】Rubyによる使えるデザインパターン(GoF)]
(http://qiita.com/moriyaman/items/0ff9e969901b55da5463#_reference-d948951bae1648337d42)
GoF以外(参考)
[デザインパターン紹介]
(http://www.hyuki.com/dp/dpinfo.html)
原則
- 変わるものを変わらないものから分離する
- インターフェイスに対してプログラミングし、実装に対して行わない
- 継承より集約
- 委譲、委譲、委譲
- 必要になるまで作るな(You Ain’t Gonna Need It./YAGNI)
利点
- 機能の追加・更新がしやすくなる
- バグの特定がしやすくなる
- 共通言語でスムーズにコミュニケーション
生成に関するパターン
AbstractFactory パターン
矛盾のないオブジェクトの組み合わせを作る
→子クラスのありえない組み合わせを防ぐ(同じグループのオブジェクトをくくる)
利点
- 関連し合うオブジェクトの集まりを生成することができる
- 整合性が必要となるオブジェクト群を誤りなしに生成できる
http://qiita.com/Momozono/items/27f0a2b1cf46bf02a515
コードサンプル
使いどころ
複数のモデルの関連、操作が同じ場合。
Builder パターン
柔軟にオブジェクトを生成をする。
複雑なコンポーネントの組み立てを簡単に使えるようにするとともに、内部ロジックを隠蔽する。また、コンポーネントの組み立て方に誤りはないか、不足はないかなどのチェックを設けることもできる。
より簡単に使えるようにするためにmethod_missingメソッドを使ったマジックメソッドを使うテクニックがある。
使いどころ
コンポーネントが複数あり、それらを組み立てる必要がある場合。
サンプルコード
FactoryMethod パターン
正しいクラスを選び出す。
使用するクラスの選択をサブクラスに押し付けることで多様な使い方を提供する。これをFactory Methodパターンと言い、クラスを選択するメソッドをファクトリメソッドという。
クラスの種類が増えるとファクトリメソッドも増えるため、ファクトリメソッドにパラメータを持たせることで汎用化する。
クラスの組み合わせに矛盾がないようにあらかじめ組み合わされたファクトリをアブストラクトファクトリという。またこの方法をAbstract Factoryパターンという。
使用するクラス(部品)を時々に応じて選択したい場合。
ActiveRecordがDBConnectionを得るためにデータベース名を指定して使用する部品(この場合はメソッド)の選択を行っている。
サンプルパターン
Prototype パターン
クラスからインスタンスを生成するのではなく、インスタンスから別のインスタンスを作り出す
Rubyではインスタンスに対してextendを行い拡張することができる。
それらのオブジェクトに対してdupメソッドを用いてインスタンスのコピーをすれば、Prototypeパターンが実現可能。
サンプル
http://morizyun.github.io/blog/ruby-design-pattern-12-builder/
http://qiita.com/onody/items/2e7de1f6db75d7b4c60b
Singleton パターン
あるクラスのインスタンスが、プログラム内に1個しか生成されないことを保証する
[シングルトンモジュール]
(https://docs.ruby-lang.org/ja/2.2.0/class/Singleton.html)
サンプルコード
public class Moon{
private static Moon moon = new Moon();
private Moon(){}
public static Moon getInstance(){
return moon;
}
}
Singletonパターンではまず、コンストラクタの識別子をprivate(プライベート)にします。private識別子のついたものは、外部クラスからの呼び出しが拒否されるため、新しいインスタンスを作り出すことができなくなるのです。これによって、Moonクラスのインスタンスは
private static Moon moon = new Moon();
によって生成されている1つだけに限定されます。
Moonクラスのインスタンスが欲しいときには、
Moon moon = Moon.getInstance();
として取得せざるをえないようなつくりになっているのです。
構造に関するパターン
振る舞いに関するパターン