2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-11-20

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)

原則

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

利点

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

生成に関するパターン

AbstractFactory パターン

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

利点

コードサンプル

使いどころ

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

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

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

構造に関するパターン

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

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?