Help us understand the problem. What is going on with this article?

デザインパターン(GoF:生成に関するパターン)

More than 3 years have passed since last update.

GoFの23パターンについて

RubyでGoFデザインパターンの適応

Java言語で学ぶデザインパターン入門

【初心者向け】Rubyによる使えるデザインパターン(GoF)

GoF以外(参考)
デザインパターン紹介

原則

  1. 変わるものを変わらないものから分離する
  2. インターフェイスに対してプログラミングし、実装に対して行わない
  3. 継承より集約
  4. 委譲、委譲、委譲
  5. 必要になるまで作るな(You Ain’t Gonna Need It./YAGNI)

利点

  • 機能の追加・更新がしやすくなる
  • バグの特定がしやすくなる
  • 共通言語でスムーズにコミュニケーション

生成に関するパターン

AbstractFactory パターン

矛盾のないオブジェクトの組み合わせを作る
→子クラスのありえない組み合わせを防ぐ(同じグループのオブジェクトをくくる)

利点

コードサンプル

http://morizyun.github.io/blog/ruby-design-pattern-14-abstract-factory/

使いどころ

複数のモデルの関連、操作が同じ場合。

Builder パターン

柔軟にオブジェクトを生成をする。

複雑なコンポーネントの組み立てを簡単に使えるようにするとともに、内部ロジックを隠蔽する。また、コンポーネントの組み立て方に誤りはないか、不足はないかなどのチェックを設けることもできる。
より簡単に使えるようにするためにmethod_missingメソッドを使ったマジックメソッドを使うテクニックがある。

使いどころ

コンポーネントが複数あり、それらを組み立てる必要がある場合。

サンプルコード

http://morizyun.github.io/blog/ruby-design-pattern-11-factory-method/

FactoryMethod パターン

正しいクラスを選び出す。

使用するクラスの選択をサブクラスに押し付けることで多様な使い方を提供する。これをFactory Methodパターンと言い、クラスを選択するメソッドをファクトリメソッドという。
クラスの種類が増えるとファクトリメソッドも増えるため、ファクトリメソッドにパラメータを持たせることで汎用化する。
クラスの組み合わせに矛盾がないようにあらかじめ組み合わされたファクトリをアブストラクトファクトリという。またこの方法をAbstract Factoryパターンという。

使用するクラス(部品)を時々に応じて選択したい場合。
ActiveRecordがDBConnectionを得るためにデータベース名を指定して使用する部品(この場合はメソッド)の選択を行っている。

サンプルパターン

http://morizyun.github.io/blog/ruby-design-pattern-12-builder/

Prototype パターン

クラスからインスタンスを生成するのではなく、インスタンスから別のインスタンスを作り出す
Rubyではインスタンスに対してextendを行い拡張することができる。
それらのオブジェクトに対してdupメソッドを用いてインスタンスのコピーをすれば、Prototypeパターンが実現可能。

サンプル

http://morizyun.github.io/blog/ruby-design-pattern-12-builder/
http://qiita.com/onody/items/2e7de1f6db75d7b4c60b

Singleton パターン

あるクラスのインスタンスが、プログラム内に1個しか生成されないことを保証する
シングルトンモジュール

サンプルコード

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();

として取得せざるをえないようなつくりになっているのです。

構造に関するパターン

http://qiita.com/kayo_h/items/756a2fe1f98e19453f92

振る舞いに関するパターン

http://qiita.com/kayo_h/items/52fafd9588a6f4aa5678

kayo311
ディレクター、時々エンジニア
neuro
二次交通に特化したモビリティプラットフォームRYDEの企画運営する東京のスタートアップです。
https://ryde-inc.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away