Java言語で学ぶデザインパターン入門 増補改訂版

2020年4月12日


増補改訂版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 参考文献

索引

書籍目次

Posted by shi-n