読書記録 - Java言語で学ぶデザインパターン入門 第3版
1. Iterator
forループ for (int i = 0; i < 10; i++) の変数 i のような役割
2. Adapter
すでに提供されているものを必要な形に変換してから利用
パターン
クラスを利用(継承)
インスタンスを利用(委譲)
利用シーン
既存のクラスに一皮被せて必要なクラスを作る
既存のクラスにバグがないことが分かっていれば、Adapter側のクラスを重点的に調べれば良い
3. Template Method
スーパークラスで処理の枠組みを定め、サブクラスで処理の具体的な内容を定める
4. Factory Method
Template Methodパターンをインスタンス生成に適用
5. Singleton
指定したクラスのインスタンスが絶対に1個しかないことを保証
インスタンスが1個しか存在しないことをプログラム上で表現
6. Prototype
原型となるインスタンスを元に新しいインスタンスを作る
利用パターン
種類が多すぎてクラスにまとめられない場合
クラスからのインスタンス生成が難しい場合
フレームワークと生成するインスタンスを分けたい場合
cloneメソッド
Javaでインスタンスのコピーを行う
実際にインスタンスのコピーを行うクラスを設計する場合は、cloneよりコピーコンストラクタやコピーファクトリを行う方が良い
7. Builder
構造を持ったインスタンスを組み立て
交換可能性
DirectorクラスはBuilderクラスのサブクラスを知らない
知らないからこそ入れ替えが容易になる
依存性の注入
対象クラスに動作に必要なインスタンスを渡すこと
DirectorクラスはBuilderクラスのサブクラスは知らないが、サブクラスのインスタンスを引数に受け取り、このインスタンスに依存して動作
英語ではDI(Dependency Injection)と呼ばれる
クラス間の結合を低くし、プログラムの再利用性を高める
8. Abstract Factory
抽象的な工場。抽象的な部品を組み合わせて抽象的な製品を作る
具体的な工場を新たに追加するのは簡単
抽象的な工場に新たな部品の追加は困難
9. Bridge
「機能のクラスの階層」と「実装のクラスの階層」を橋渡し
機能のクラスの階層
スーパークラスに基本的な機能を持つ
サブクラスで新しい機能を追加
実装のクラスの階層
スーパークラスは抽象メソッドによってインタフェース(API)を規定
サブクラスは具象メソッドによっていインタフェース(API)を実装
10. Strategy
実装したアルゴリズムを交換できるようにする
アルゴリズムのインタフェース(API)部分だけを規定し、委譲によってアルゴリズムを利用
⇨アルゴリズムを容易に切り替えられる
11. Composite
容器と中身を同一視し、再帰的な構造を作る
12. Decorator
オブジェクトに飾り付けを施していくようなパターン
補講: 継承と委譲における同一視
継承
code: java
class Parent {
void parentMethod() {
}
}
class Child extends Parent {
void childMethod() {
}
}
Parent obj = new Child(); // ChildインスタンスをParent型の変数に代入できる
obj.parentMethod(); // Parentから継承するメソッドをそのまま呼び出す
委譲
code:java
// RoseとVioletは共通メソッドを持っているが、methodが共通であることがソース内に明示されていない
// なんか嫌な感じ
class Rose {
Violet obj = ...
void method() {
obj.method();
}
}
class Violet {
void method() {
}
}
// 共通の抽象クラス(Flower)があるとわかりやすい
abstract class Flower {
abstract void method();
}
class Rose extends Flower {
Violet obj = ...
@Override
void method() {
obj.method();
}
}
class Violet extends Flower {
@Override
void method() {
}
}
// あるいはインタフェースもあり得る
interface Flower {
abstract void method();
}
class Rose implements Flower {
// 中身は抽象クラスのパターンと同じ
}
class Violet implements Flower {
// 中身は抽象クラスのパターンと同じ
}
13. Visitor
データ構造と処理を分離
14. Chain of Responsibility
複数のオブジェクトを鎖のように繋ぎ、そのオブジェクトを順次渡り歩いて目的のオブジェクトを決定する