Java言語で学ぶデザインパターン入門 増補改訂版
SBクリエイティブ
著者:結城浩
はじめに
本書の特徴
本書の読者
本書の構成
本書のサンプルプログラム
本書で使う用語上の注意
謝辞
「増補改訂版」の刊行にあたって
目次
UMLについて
UML
クラス図
クラスの関連
シーケンス図
デザインパターンを学ぶ前に
第1部 デザインパターンに慣れる
第1章 Iterator-1つ1つ数え上げる
Iteratorパターン
サンプルプログラム
Aggregateインタフェース
Iteratorインタフェース
Bookクラス
BookShelfクラス
BookShelfIteratorクラス
Mainクラス
Iteratorパターンの登場人物
あなたの考えを広げるためのヒント
実装がどうであれ、Iteratorを使える
抽象クラスやインタフェースはどうも苦手で・・・
AggrgegateとIteratorの対応
「次」は間違いやすい
「最後」も間違いやすい
複数のIterator
イテレータの種類いろいろ
deleteIteratorは不要
関連しているパターン
この章で学んだこと
練習問題
第2章 Adapter-一皮かぶせて再利用
Adapterパターン
サンプルプログラム(1)(継承を使ったもの)
Bannerクラス
Printインタフェース
PrintBannerクラス
Mainクラス
サンプルプログラム(2)(委譲を使ったもの)
Printクラス
PrintBannerクラス
Adapterパターンの登場人物
あなたの考えを広げるためのヒント
どんなときに使うのだろう
たとえソースがなくても
バージョンアップと互換性
かけ離れたクラス
関連しているパターン
この章で学んだこと
練習問題
第2部 サブクラスにまかせる
第3章 Template Method-具体的な処理をサブクラスにまかせる
Template Methodパターン
テンプレートとは何か
Template Methodパターンとは何か
サンプルプログラム
AbstractDisplayクラス
CharDisplayクラス
StringDisplayクラス
Mainクラス
Template Methodパターンの登場人物
あなたの考えを広げるためのヒント
ロジックが共通化できる
スーパークラスとサブクラスの連携プレー
サブクラスをスーパークラスと同一視する
関連しているパターン
補講:クラス階層と抽象クラス
スーパークラスからサブクラスへの要請
抽象クラスの意義
スーパークラスとサブクラスの協調
この章で学んだこと
練習問題
第4章 FactoryMethod-インスタンス作成をサブクラスにまかせる
Factory Methodパターン
サンプルプログラム
Productクラス
Factoryクラス
IDCardクラス
IDCardFactoryクラス
Mainクラス
Factory Methodパターンの登場人物
あなたの考えを広げるためのヒント
フレームワークと肉付け
インスタンス生成-メソッドの実装方法
パターン利用と開発者間の意思疎通
関連しているパターン
この章で学んだこと
練習問題
第3部 インスタンスを作る
第5章 Singleton―たった1つのインスタンス
Singletonパターン
サンプルプログラム
Singletonクラス
Mainクラス
Singletonパターンの登場人物
あなたの考えを広げるためのヒント
なぜ制限を設ける必要があるのか
唯一のインスタンスはいつ生成されているか
関連しているパターン
この章で学んだこと
練習問題
第6章 Prototype―コピーしてインスタンスを作る
Prototypeパターン
サンプルプログラム
Productインタフェース
Managerクラス
MessageBoxクラス
UnderlinePenクラス
Mainクラス
Prototypeパターンの登場人物
あなたの考えを広げるためのヒント
クラスからインスタンスを作ってはいけないのか
クラス名は束縛なのか
関連しているパターン
補講:cloneメソッドとjava.lang.Cloneableインタフェース
Java言語のclone
cloneメソッドはどこで定義されているか
Cloneableが要求するメソッドは?
cloneメソッドは浅いコピーを行う
この章で学んだこと
練習問題
第7章 Builder―複雑なインスタンスを組み立てる
Builderパターン
サンプルプログラム
Builderクラス
Directorクラス
TextBuilderクラス
HTMLBuilderクラス
Mainクラス
Builderパターンの登場人物
あなたの考えを広げるためのヒント
誰が何を知っているか
設計時に決められること、決められないこと
ソースの読み方、修正の仕方
関連しているパターン
この章で学んだこと
練習問題
第8章 Abstract Factory―関連する部品を組み合わせて製品を作る
Abstract Factoryパターン
サンプルプログラム
抽象的な部品:Itemクラス
抽象的な部品:Linkクラス
抽象的な部品:Trayクラス
抽象的な部品:Pageクラス
抽象的な工場:Factoryクラス
工場を使って部品を組み合わせ、製品を作る:Mainクラス
抽象的な工場:ListFactoryクラス
抽象的な部品:ListLinkクラス
抽象的な部品:ListTrayクラス
抽象的な部品:ListPageクラス
サンプルプログラムに別の具体的な工場を追加
抽象的な工場:TableFactoryクラス
抽象的な部品:TableLinkクラス
抽象的な部品:TableTrayクラス
抽象的な部品:TablePageクラス
Abstract Factoryパターンの登場人物
あなたの考えを広げるためのヒント
具体的な工場を新たに追加するのは簡単
部品を新たに追加するのは困難
関連しているパターン
この章で学んだこと
練習問題
第4部 分けて考える
第9章 Bridge―機能の階層と実装の階層を分ける
Bridgeパターン
クラス階層の2つの役割
サンプルプログラム
機能のクラス階層:Displayクラス
機能のクラス階層:CountDisplayクラス
実装のクラス階層:DisplayImplクラス
実装のクラス階層:StringDisplayImplクラス
Mainクラス
Bridgeパターンの登場人物
あなたの考えを広げるためのヒント
分けておけば、拡張するのが楽になる
継承は固い結びつき、委譲はゆるやかな結びつき
関連しているパターン
この章で学んだこと
練習問題
第10章 Strategy―アルゴリズムをごっそり切り替える
Strategyパターン
サンプルプログラム
Handクラス
Strategyインタフェース
WinningStrategyクラス
ProbStrategyクラス
Playerクラス
Mainクラス
Strategyパターンの登場人物
あなたの考えを広げるためのヒント
わざわざStrategy役を作る必要ってあるの?
実行中に切り替えることも可能
関連しているパターン
この章で学んだこと
練習問題
第5部 同一視
第11章 Composite―容器と中身の同一視
Compositeパターン
サンプルプログラム
Entryクラス
Fileクラス
Directoryクラス
FileTreatmentExceptionクラス
Mainクラス
Compositeパターンの登場人物
あなたの考えを広げるためのヒント
複数と単数の同一視
addはどこに置くべきか
再帰的構造はあらゆる場面で登場する
関連しているパターン
この章で学んだこと
練習問題
第12章 Decorator−飾り枠と中身の同一視
Decoratorパターン
サンプルプログラム
Displayクラス
StringDisplayクラス
Borderクラス
SideBorderクラス
FullBorderクラス
Mainクラス
Decoratorパターンの登場人物
あなたの考えを広げるためのヒント
透過的なインタフェース(API)
中身を変えずに、機能追加ができる
動的な機能追加ができる
単純な品揃えでも、多様な機能追加ができる
java.ioパッケージとDecoratorパターン
小さいクラスが増えてしまう
関連しているパターン
補講:継承と委譲における同一視
継承-サブクラスとスーパークラスとを同一視
委譲-自分と委譲先とを同一視
この章で学んだこと
練習問題
第6部 構造を渡り歩く
第13章 Visitor―構造を渡り歩きながら仕事をする
Visitorパターン
サンプルプログラム
Visitorクラス
Elementインタフェース
Entryクラス
Fileクラス
Directoryクラス
ListVisitorクラス
FileTreatmentExceptionクラス
Mainクラス
Visitor側とElement側の相互呼び出し
Visitorパターンの登場人物
あなたの考えを広げるためのヒント
ダブルディスパッチ
なぜこんなに複雑なことをするのか
The Open-Closed Principle-拡張については開き、修正については閉じる
ConcreteVisitor役の追加は簡単
ConcreteElement役の追加は困難
Visitorが処理するためには何が必要か
関連しているパターン
この章で学んだこと
練習問題
第14章 Chain of Responsibility―責任のたらい回し
Chain of Responsibilityパターン
サンプルプログラム
Troubleクラス
Supportクラス
NoSupportクラス
LimitSupportクラス
OddSupportクラス
SpecialSupportクラス
Mainクラス
Chain of Responsibilityパターンの登場人物
あなたの考えを広げるためのヒント
要求を出す人と要求を処理する人をゆるやかに結びつける
動的に連鎖の形態を変える
自分の仕事に集中できる
たらい回しで処理は遅くならないのか
関連しているパターン
この章で学んだこと
練習問題
第7部 シンプルにする
第15章 Facade―シンプルな窓口
Facadeパターン
サンプルプログラム
Databaseクラス
HtnlWriterクラス
PageMakerクラス
Mainクラス
Facadeパターンの登場人物
あなたの考えを広げるためのヒント
Facade役がやっていることは何だろう
再帰的なFacadeパターンの適用
プログラマがFecadeを作られない理由-心理的要因
関連しているパターン
この章で学んだこと
練習問題
第16章 Mediator―相手は相談役1人だけ
Mediatorパターン
サンプルプログラム
Mediatorクラス
Colleagueクラス
ColleagueTextFieldクラス
ColleagueCheckboxクラス
LoginFrameクラス
Mainクラス
Mediatorパターンの登場人物
あなたの考えを広げるためのヒント
分散が災いになるとき
通信経路の増加
再利用できるのは何か?
関連しているパターン
この章で学んだこと
練習問題
第8部 状態を管理する
第17章 Observer―状態の変化を通知する
Observerパターン
サンプルプログラム
Observerインタフェース
NumberGeneratorクラス
RandomNumberGeneratorクラス
DigitObserverクラス
GraphObserverクラス
Mainクラス
Observerパターンの登場人物
あなたの考えを広げるためのヒント
関連しているパターン
この章で学んだこと
練習問題
第18章 Memento―状態を保存する
Mementoパターン
サンプルプログラム
Mementoクラス
Gamerクラス
Mainクラス
Mementoパターンの登場人物
あなたの考えを広げるためのヒント
2つのインタフェース(API)とアクセス制御
Mementoをいくつ持つ?
Mementoの賞味期限は?
Caretaker役とOriginator役を分けること意味
関連しているパターン
この章で学んだこと
練習問題
第19章 State―状態をクラスとして表現する
Stateパターン
サンプルプログラム
金庫設備システム
Stateパターンを使わない疑似コーディング
Stateパターンを使った疑似コーディング
Stateインタフェース
DayStateクラス
NightStateクラス
Contextインタフェース
SafeFrameクラス
Mainクラス
Stateパターンの登場人物
あなたの考えを広げるためのヒント
分割して統治せよ
状態に依存した処理
状態遷移は誰が管理すべきか
自己矛盾が起こらない
新しい状態を追加するのは簡単
複数の顔を持つインスタンス
関連しているパターン
この章で学んだこと
練習問題
第9部 無駄をなくす
第20章 Flyweight―同じものを共有して無駄をなくす
Flyweightパターン
サンプルプログラム
BigCharクラス
BigCharFactoryクラス
BigDtringクラス
Mainクラス
Flyweightパターンの登場人物
あなたの考えを広げるためのヒント
複数個所に影響が及ぶ
intrinsicとextrinsic
管理されているインスタンスは、ガベージコレクションされない
メモリ以外のリソース
関連しているパターン
この章で学んだこと
練習問題
第21章 Proxy―必要になってから作る
Proxyパターン
サンプルプログラム
Printerクラス
Printableインタフェース
PrinterProxyクラス
Mainクラス
Proxyパターンの登場人物
あなたの考えを広げるためのヒント
代理人を使ってスピードアップ
代理人と本人を分ける必要はあるのか
代理と委譲
透過的ということ
HTTPプロキシー
さまざまなProxy
関連しているパターン
この章で学んだこと
練習問題
第10クラスで表現する
第22章 Command―命令をクラスにする
Commandパターン
サンプルプログラム
Commandインタフェース
MacroCommandクラス
DrawCommandクラス
Drawableインタフェース
DrawCanvasクラス
Mainクラス
Commandパターンの登場人物
あなたの考えを広げるためのヒント
命令が持つべき情報は?
履歴の保存
アダプター
関連しているパターン
この章で学んだこと
練習問題
第23章 Interpreter―文法規則をクラスで表現する
Interpreterパターン
ミニ言語
ミニ言語の命令
ミニ・プログラムの例
ミニ言語の文法
ターミナル・エクスプレッションとノンターミナル・エクスプレッション
サンプルプログラム
Nodeクラス
ProgramNodeクラス
CommandListNodeクラス
CommandNodeクラス
RepeatCommandNodeクラス
PrimitiveCommandNodeクラス
Contextクラス
ParseExceptionクラス
Mainクラス
Interpreterパターンの登場人物
あなたの考えを広げるためのヒント
他にどんなミニ言語があるのだろうか
読み飛ばすか読み取るか
関連しているパターン
この章で学んだこと
練習問題
付録A 練習問題の解答
付録B サンプルプログラムの実行手順
付録C GoFによるデザインパターンの分類
付録D デザインパターンQ&A
付録E 参考文献
索引