zuknow learn together

新しい教材を作成

デザインパターン(GoF)

カード 23枚 作成者: hikone (作成日: 2014/10/12)

  • 関連する一連のインスタンスを状況に応じて適切に生成する方法を提供する。


    生成

解説面  クリックしてカードを裏返す

アプリをダウンロードして、このコンテンツを学習しよう! AppStore / Google Play

教材の説明:

[Design patterns] solve specific design problems and make object-oriented designs more flexible, elegant, and ultimately reusable. They help designers reuse successful designs by basing new designs on prior experience. A designer who is familiar with such patterns can apply them immediately to design problems without having to rediscover them.

公開範囲:

公開

言語:

  • カード表 : 日本語
  • カード裏 : 日本語
  • このエントリーをはてなブックマークに追加
  • 1

    関連する一連のインスタンスを状況に応じて適切に生成する方法を提供する。

    補足(例文と訳など)

    • 生成
    • 関連するインスタンス群を生成するための API を集約することによって、複数のモジュール群の再利用を効率化することを目的とする。日本語では「抽象的な工場」と翻訳される事が多い。Kit パターンとも呼ばれる。

    答え

    • Abstract Factory パターン

    解説

  • 2

    複合化されたインスタンスの生成過程を隠蔽する。

    補足(例文と訳など)

    • 生成
    • オブジェクトの生成過程を抽象化することによって、動的なオブジェクトの生成を可能にする。

    答え

    • Builder パターン

    解説

  • 3

    実際に生成されるインスタンスに依存しない、インスタンスの生成方法を提供する。

    補足(例文と訳など)

    • 生成
    • Factory Method パターンは、オブジェクトの生成をサブクラスに委ねることによって、プログラム内で使用されるインスタンスの型の制約を緩めることを目的とする。Virtual Constructor パターンとも呼ばれる

    答え

    • Factory Method パターン

    解説

  • 4

    同様のインスタンスを生成するために、原型のインスタンスを複製する。

    補足(例文と訳など)

    • 生成
    • 生成されるオブジェクトの種別がプロトタイプ(典型)的なインスタンスであるときに使用され、このプロトタイプを複製して新しいオブジェクトを生成する。 このパターンは Abstract Factory パターンでなされるように、クライアント・アプリケーションにおいてオブジェクトの生成者をサブクラスにすることを回避する 標準的な方法(例えば'new')で新しいオブジェクトを作ることによる固有のコストが所与のアプリケーションにとって高すぎる時にそれを回避する ために用いられる。

    答え

    • Prototype パターン

    解説

  • 5

    あるクラスについて、インスタンスが単一であることを保証する。

    補足(例文と訳など)

    • 生成
    • Singleton パターンを用いると、そのクラスのインスタンスが1つしか生成されないことを保証することができる。

    答え

    • Singleton パターン

    解説

  • 6

    元々関連性のない2つのクラスを接続するクラスを作る。

    補足(例文と訳など)

    • 構造
    • Adapter パターンを用いると、既存のクラスに対して修正を加えることなく、インタフェースを変更することができる。Adapter パターンを実現するための手法として継承を利用した手法と委譲を利用した手法が存在する。継承を利用したAdapterは、利用したいクラスのサブクラスを作成し、そのサブクラスに対して必要なインタフェースを実装することで実現される。委譲を利用したAdapterは、利用したいクラスのインスタンスを生成し、そのインスタンスを他クラスから利用することで実現される。

    答え

    • Adapter パターン

    解説

  • 7

    クラスなどの実装と、呼出し側の間の橋渡しをするクラスを用意し、実装を隠蔽する。

    補足(例文と訳など)

    • 構造
    • 「橋渡し」のクラスを用意することによって、クラスを複数の方向に拡張させることを目的とする。

    答え

    • Bridge パターン

    解説

  • 8

    再帰的な構造を表現する。

    補足(例文と訳など)

    • 構造
    • Composite パターンを用いるとディレクトリとファイルなどのような、木構造を伴う再帰的なデータ構造を表すことができる。 Composite パターンにおいて登場するオブジェクトは、「枝」と「葉」であり、これらは共通のインターフェースを実装している。そのため、枝と葉を同様に扱えるというメリットがある。Composite パターンを用いる際には、データ構造がきちんと木構造を保つようにしなければならない。

    答え

    • Composite パターン

    解説

  • 9

    あるインスタンスに対し、動的に付加機能を追加する。Filterとも呼ばれる。

    補足(例文と訳など)

    • 構造
    • このパターンは、既存のオブジェクトに新しい機能や振る舞いを動的に追加することを可能にする。 Decorator パターンの方針は、既存のオブジェクトを新しい Decorator オブジェクトでラップすることである。 その方法として、Decorator のコンストラクタの引数でラップ対象の Component オブジェクトを読み込み、コンストラクタの内部でそのオブジェクトをメンバに設定することが一般的である。 Decorator パターンは、既存のクラスを拡張する際にクラスの継承の代替手段として用いられる。継承がコンパイル時に機能を拡張するのに対し、Decorator パターンはプログラムの実行時に機能追加をする点が異なる。

    答え

    • Decorator パターン

    解説

  • 10

    複数のサブシステムの窓口となる共通のインタフェースを提供する。

    補足(例文と訳など)

    • 構造
    • Facade(ファサード)とは「建物の正面」を意味する。異なるサブシステムを単純な操作だけを持ったFacadeクラスで結び、サブシステム間の独立性を高める事を目的とする。 Facadeパターンの例として、サブシステムとしてのコンパイラーを考える。システムとしてのコンパイラーは字句解析器や構文解析器などから構成されている。これらの構成要素は、新たなコンパイラーやその他ソフトウェアを作成する上でサブシステムとして利用することが出来る。しかし、一般ユーザーにとってコンパイラーはソースコードからプログラムを生成するためのものであり、ソースコードをコンパイルできる機能があれば十分である。そこでサブシステムから一般ユーザーのために一般ユーザーが必要としているコンパイル機能だけを呼び出すクラスを提供する。ここで提供されたコンパイル機能を持つクラスがFacadeクラスである。Facadeクラスが提供された事により一般ユーザーはサブシステムの詳細を知る必要がなくなり、サブシステムの実装から解放されるのである。 要件 ・Facadeクラスはあくまでサブシステム内部に仕事を投げるだけで複雑な実装は持たない。多様な機能の塊であるサブシステムから、サブシステムを利用するユーザーの用途に合わせた窓口(インターフェース)を提供するだけである。 ・Facadeクラスをサブシステム自体が利用する事はない。Facadeクラスはあくまでサブシステム末端の窓口であるため、同じサブシステムから利用される事はない。 ・Facadeパターンはサブシステムの直接使用を妨げない。Facadeクラスの利用は強制ではなく、必要であればサブシステムの機能を直接利用できる。言語によっては無名名前空間やPackageスコープによりサブシステムを利用者から隔離できるが、Facadeパターンはそのような制限はしない。

    答え

    • Facade パターン

    解説

  • 11

    多数のインスタンスを共有し、インスタンスの構築のための負荷を減らす。

    補足(例文と訳など)

    • 構造
    • 等価なインスタンスを別々の箇所で使用する際に、一つのインスタンスを再利用することによってプログラムを省リソース化することを目的とする。FlyweightFactory は Singleton として実装されることが多い。

    答え

    • Flyweight パターン

    解説

  • 12

    共通のインタフェースをもつインスタンスを内包し、利用者からのアクセスを代理する。Wrapperとも呼ばれる。

    補足(例文と訳など)

    • 構造
    • Proxy(プロキシ、代理人)とは、大まかに言えば、別の物のインタフェースとして機能するクラスである。その「別の物」とは何でもよく、ネットワーク接続だったり、メモリ上の大きなオブジェクトだったり、複製がコスト高あるいは不可能な何らかのリソースなどである。 Proxy パターンのよく知られている例として、参照カウント付きポインタオブジェクトがある。 複雑なオブジェクトの複数のコピーが必須となる状況では、Proxy パターンに Flyweight パターンを加えることでメモリ使用量を抑えることができる。通常、複雑なオブジェクトのインスタンスは1つだけ生成し、プロキシオブジェクトを複数生成する。それらプロキシオブジェクトは唯一の複雑なオブジェクトへの参照を含む。プロキシへの操作は、オリジナルのオブジェクトにフォワードされる。プロキシオブジェクトが全て破棄されると、参照されていた複雑なオブジェクトの使用していたメモリも解放される。

    答え

    • Proxy パターン

    解説

  • 13

    イベントの送受信を行う複数のオブジェクトを鎖状につなぎ、それらの間をイベントが渡されてゆくようにする。

    補足(例文と訳など)

    • 振る舞い
    • 一つの コマンドオブジェクトと一連の 処理オブジェクトから構成される。各処理オブジェクトは、処理できるコマンドオブジェクトの種類と、自身が処理できないコマンドオブジェクトをチェーン内の次の処理オブジェクトに渡す方法を記述する情報を保持する。また、新たな処理オブジェクトをチェーンの最後に追加する機構を備える。 標準的な chain-of-responsibility のモデルの派生ハンドラーがディスパッチャとして動作し、コマンドを様々な方向に送出できるようにすることで、いわば tree of responsibility を形成しているものもある。 また、これを再帰的に行うケースもあり、処理オブジェクトが上位の処理オブジェクトを、問題の一部を解決するコマンドとともに呼び出すこともある。こうした場合再帰はコマンドが処理されるか、全てのツリーを巡回するまで継続される。XML のインタプリタ(パースはするが実行はしない)などがこの例に当てはまるだろう。 このパターンはプログラミングにおいてよく用いられる、疎結合性を促進させる方法である。

    答え

    • Chain of Responsibility パターン

    解説

  • 14

    複数の異なる操作について、それぞれに対応するオブジェクトを用意し、オブジェクトを切り替えることで操作の切替えを実現する。

    補足(例文と訳など)

    • 振る舞い
    • command オブジェクトは、動作とそれに伴うパラメータをカプセル化したものである。 例として、印刷を行うライブラリが PrintJob クラスを備えているとする。ライブラリのユーザーは新たに PrintJob オブジェクトを作成し、パラメータ(印刷するドキュメント、印刷部数など)をセットし、最後にプリンターにジョブを送信するメソッドを呼び出す。 この場合、同じ機能を多数のパラメータを持つ SendJobToPrinter() 関数で提供することができる。command クラスを記述すると、関数を記述するよりコードが多くなるため、クラスを使用するにはそれなりの理由がなければならない。理由として可能性のあるものは多数ある。 ・Command オブジェクトは、手続きに必要なパラメータの一時格納場所として便利である。関数呼び出しのためのパラメータを集めて、後で使用するためにコマンドを保存しておくことができる。 ・クラスはコマンドに関連したコードとデータを集める場所として便利である。コマンドオブジェクトはたとえば名前や機能を呼び出したユーザーといったコマンドについての情報を保持し、予測時間などの処理についての質問に答えることを可能にする。 ・コマンドをオブジェクトとして扱うことにより、複数のコマンドを保持するデータ構造を実現できる。複雑な処理はコマンドオブジェクトからなる木構造やグラフ構造として扱うことができる。スレッドプールであれば、ワーカースレッドが使用するコマンドオブジェクトの優先度つきキューを管理することになるだろう。 ・コマンドをオブジェクトとして扱うことで、コマンドオブジェクトが(たとえばスタックに)保存されていればアンドゥ可能な操作を実現できるようになる。 ・コマンドは汎用的なコンポーネントを構築するための抽象化の方法として有用である。たとえば、任意のタイプのコマンドオブジェクトを扱うことができるスレッドプール新しいタイプのコマンドオブジェクトが後で作られても、コマンドは自動的に汎用的なコンポーネントとともに動作する。たとえば、Java において、汎用の ThreadPool クラスがjava.lang.Runnable インタフェース(ThreadPoolExecutor.execute(Runnable task)参照を実装した任意のオブジェクトを受け付けるaddTask(Runnable task) メソッドを持っているような場合である。

    答え

    • Command パターン

    解説

  • 15

    構文解析のために、文法規則を反映するクラス構造を作る。

    補足(例文と訳など)

    • 振る舞い
    • Interpreter パターンの基本的な考えは、定義された種類の問題を素早く解くために、ドメインに特化した言語を実装することである。特化言語は汎用の言語よりも数倍から数百倍高速に問題を解ける場合が多い。

    答え

    • Interpreter パターン

    解説

  • 16

    複数の要素を内包するオブジェクトのすべての要素に順にアクセスする方法を提供する。反復子。

    補足(例文と訳など)

    • 振る舞い
    • コンテナオブジェクトの要素を列挙する手段を独立させることによって、コンテナの内部仕様に依存しない反復子を提供することを目的とする。

    答え

    • Iterator パターン

    解説

  • 17

    オブジェクト間の相互作用を仲介するオブジェクトを定義し、オブジェクト間の結合度を低くする。

    補足(例文と訳など)

    • 振る舞い
    • 統一されたインタフェース のセットを提供するパターンである。このパターンは、プログラムの動作する振る舞いを変更できるという点で、振る舞いに関するパターンと考えられている。 通常、プログラムは複数の(時には多数の)クラスからなり、ロジックと計算がクラスに配置される。しかし、プログラムでクラスの数が増えるに従い、特に保守やリファクタリングをする際、クラス間の通信の問題が複雑になり、プログラムを読んだり保守したりすることが困難になる。さらに、他のクラスに影響を与える可能性があるため、変更も難しくなる。 Mediator パターンを用いると、オブジェクト間の通信は mediator によってカプセル化され、オブジェクト同士で直接通信せず、mediator を介して行うようになる。これにより通信するオブジェクト同士の依存関係を削減し、結合の度合いを下げることができる。

    答え

    • Mediator パターン

    解説

  • 18

    データ構造に対する一連の操作のそれぞれを記録しておき、以前の状態の復帰または操作の再現が行えるようにする。

    補足(例文と訳など)

    • 振る舞い
    • オブジェクトを以前の状態に(ロールバックにより)戻す能力を提供する。 memento パターンは二つのオブジェクトによって用いられる。'originator'と'caretaker' である。'originator' は内部状態を持つオブジェクトである。caretaker は originator に何らかの動作を行うが、変更を戻す能力を持ちたいとする。まず、caretaker は originator に memento を要求する。次に任意の操作(あるいは一連の操作)を行う。操作を行う前の状態に戻すために、memento オブジェクトを originator に返却する。memento オブジェクト自体は、不透明オブジェクト( caretaker が変更してはいけないもの) である。このパターンを用いる場合、originator がほかのオブジェクトやリソースを変更してしまうかどうか注意が必要である。memento パターンは単一のオブジェクトに対して働くためである。 memento パターンの古典的な例として、擬似乱数発生器や、有限オートマトンの状態などがある。

    答え

    • Memento パターン

    解説

  • 19

    インスタンスの変化を他のインスタンスから監視できるようにする。Listenerとも呼ばれる。

    補足(例文と訳など)

    • 振る舞い
    • プログラム内のオブジェクトの状態を観察(observe)するようなプログラムで使われるデザインパターンの一種。出版-購読型モデルとも呼ばれる。暗黙的呼び出しの原則と関係が深い。 分散イベント処理システムの実装に主に使われる。言語によっては、このパターンで扱われる問題は言語が持つイベント処理構文で処理される。リアルタイムのアプリケーション配置の手段として興味深い機能である。 このパターンの基本は、(オブザーバまたはリスナーと呼ばれる)1つ以上のオブジェクトを、(サブジェクトと呼ばれる)対象オブジェクトが発生するイベントを観察するために登録する。イベントを発生するオブジェクトは一般に複数のオブザーバを管理する。 典型的用法 ・ユーザーが何らかの操作をするなどの外部イベントを待つ。イベント駆動型プログラミング参照。 ・あるオブジェクトの属性値の変化を待つ。なお、複数の属性値の変化でコールバック関数を呼び出すようにしているとイベントの連鎖的発生を引き起こす。 ・メーリングリストで、何らかのイベント(新製品情報など)があったとき、購読者リストに登録している人にメッセージを送る。 Observer パターンは Model View Controller (MVC) パラダイムの実装に使われることも多い。MVC では、モデルとビューの間のループに Observer パターンが使われる。通常、モデルの変化を引き金として、ビュー(オブザーバ)にそれを通知する。

    答え

    • Observer パターン

    解説

  • 20

    オブジェクトの状態を変化させることで、処理内容を変えられるようにする。

    補足(例文と訳など)

    • 振る舞い
    • このパターンはオブジェクトの状態(state)を表現するために用いられる。ランタイムでそのタイプを部分的に変化させるオブジェクトを扱うクリーンな手段となる。

    答え

    • State パターン

    解説

  • 21

    データ構造に対して適用する一連のアルゴリズムをカプセル化し、アルゴリズムの切替えを容易にする。

    補足(例文と訳など)

    • 振る舞い
    • アルゴリズムを実行時に選択することができるデザインパターンである。 ポリモーフィズムを持たないようなプログラミング言語では、このパターンによって解決される問題は、関数ポインタや委譲を使った記述によりリフレクションの形態で扱われる。 このパターンは、関数が第一級オブジェクトである言語では暗黙のうちに使用されている。例として Python コード を参照のこと。 Strategy パターンは、アプリケーションで使用されるアルゴリズムを動的に切り替える必要がある際に有用である。Strategy パターンはアルゴリズムのセットを定義する方法を提供し、これらを交換可能にすることを目的としている。Strategy パターンより、アルゴリズムを使用者から独立したまま様々に変化させることができるようになる。 Strategy パターンの UML クラス図は Bridge パターンのものと同じである。しかし、これら二つのデザインパターンはその意図が同じではない。Strategy パターンは 振る舞い に対するパターンであるが、Bridge パターンは 構造 に対するパターンである。 一般にコンテキストと戦略との結合は、Bridge パターンにおける抽象化と実装の結合より強固である。 Strategy パターンに従うと、クラスの振る舞いは継承されるべきではなく、インターフェイスを用いてカプセル化するべきである。例として Car クラスを考えると、Car の振る舞いにはブレーキとアクセルがある。 アクセルとブレーキの振る舞いはモデルにより大きく異なるため、良くあるアプローチはこれらの振る舞いをサブクラスとして実装することであるが、このアプローチには大きな問題点がある。すなわち、アクセルとブレーキの振る舞いは、新たな Car モデルごとに宣言されなければならない。これはモデルが少ないときには問題にならないが、モデルの数が増えるにつれ、それらの振る舞いを管理する作業が大幅に増加し、またコードがモデル間で重複することになる。さらに、各コードを詳しく分析しなければそれぞれのモデル用の振る舞いの性質を知ることができない。 これに対して Strategy パターンでは、継承ではなく合成を用いる。Strategy パターンにおける振る舞いは別々のインターフェイスと、これらのインターフェイスを実装した抽象クラスとして定義される。具体的なクラスは、これらのインターフェイスをカプセル化する。これにより、振る舞いと、それを用いるクラスがうまく分離できる。振る舞いは、それを用いるクラスに変更を加えずに変更することができ、クラスは大きなコード変更を必要とすることなく、使用する実装を切り替えることで振る舞いを切り替えることができる。振る舞いは設計時にも実行時にも変更することができる。例として、Car オブジェクトのブレーキの振る舞いを、メンバー brakeBehavior を BrakeWithABS から Brake に変えることで変更できる: これにより設計に優れた柔軟性をもたせることができ、かつ拡張に対して開放的であり変更に対して閉鎖的であるべきとする OCP (Open Closed Principle, 開放/閉鎖原則)とも調和を保つことができる。

    答え

    • Strategy パターン

    解説

  • 22

    あるアルゴリズムの途中経過で必要な処理を抽象メソッドに委ね、その実装を変えることで処理が変えられるようにする。

    補足(例文と訳など)

    • 振る舞い
    • Template Method パターンの目的は、ある処理のおおまかなアルゴリズムをあらかじめ決めておいて、そのアルゴリズムの具体的な設計をサブクラスに任せることである。 そのため、システムのフレームワークを構築するための手段としてよく活用される。

    答え

    • Template Method パターン

    解説

  • 23

    データ構造を保持するクラスと、それに対して処理を行うクラスを分離する。

    補足(例文と訳など)

    • 振る舞い
    • アルゴリズムをオブジェクトの構造から分離するためのデザインパターンである。分離による実用的な結果として、既存のオブジェクトに対する新たな操作を構造を変更せずに追加することができる。 基本的には Visitor パターンは一群のクラスに対して新たな仮想関数をクラス自体を変更せずに追加できるようにする。そのために、全ての仮想関数を適切に特化させた Visitor クラスを作成する。Visitor はインスタンスへの参照を入力として受け取り、ダブルディスパッチを用いて目的を達する。 Visitor は強力であるが、既存の仮想関数と比較して制限もある。各クラス内に小さなコールバックメソッドを追加する必要があり、各クラスのコールバックメソッドは新たなサブクラスで継承することができない。

    答え

    • Visitor パターン

    解説

56986

セットの学習コンテンツ

公開初月で
60,000
ダウン
ロード!

無料アプリはこちら!

英単語をウェブサイト
からzuknowに簡単登録

覚えたい単語を選択するだけ!
簡単にzuknowに登録することが
できます

Get the free Chrome Extension

トップ