Java言語で学ぶデザインパターン入門 第3版


Java言語で学ぶデザインパターン入門第3版


SBクリエイティブ


著者:結城浩


はじめに
本書の特徴
本書の読者
本書の構成
本書のサンプルプログラム
本書で使う用語上の注意
謝辞
「増補改訂版」の刊行にあたって
「第3版」の刊行にあたって
目次
UMLについて
 UML
 クラス図
 クラスの関連
 シーケンス図
デザインパターンを学ぶ前に

第1部 デザインパターンに慣れる
第1章 Iterator-処理を繰り返す
 Iteratorパターン
 サンプルプログラム
  Iterableインタフェース
  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パターンの登場人物
 あなたの考えを広げるためのヒント
  フレームワークと肉付け
  インスタンス生成-メソッドの実装方法
  パターン利用と開発者間の意思疎通
  static Factory Method
 関連しているパターン
 この章で学んだこと
 練習問題

第3部 インスタンスを作る
第5章 Singleton―たった1つのインスタンス
 Singletonパターン
 サンプルプログラム
  Singletonクラス
  Mainクラス
 Singletonパターンの登場人物
 あなたの考えを広げるためのヒント
  なぜ制限を設ける必要があるのか
  唯一のインスタンスはいつ生成されているか
  enumを使ったSingleton
 関連しているパターン
 この章で学んだこと
 練習問題

第6章 Prototype―コピーしてインスタンスを作る
 Prototypeパターン
 サンプルプログラム
  Productインタフェース
  Managerクラス
  MessageBoxクラス
  UnderlinePenクラス
  Mainクラス
 Prototypeパターンの登場人物
 あなたの考えを広げるためのヒント
  クラスからインスタンスを作ってはいけないのか
  クラス名は束縛なのか
 関連しているパターン
 補講:cloneメソッドとjava.lang.Cloneableインタフェース
  Java言語のclone
  cloneメソッドはどこで定義されているか
  Cloneableが要求するメソッドは?
  cloneメソッドは浅いコピーを行う
  cloneは使いにくい
 この章で学んだこと
 練習問題

第7章 Builder―複雑なインスタンスを組み立てる
 Builderパターン
 サンプルプログラム
  Builderクラス
  Directorクラス
  TextBuilderクラス
  HTMLBuilderクラス
  Mainクラス
 Builderパターンの登場人物
 関連しているパターン
 あなたの考えを広げるためのヒント
  誰が何を知っているか
  依存性の注入(Dependency Injection)
  設計時に決められること、決められないこと
  ソースの読み方、修正の仕方
 この章で学んだこと
 練習問題

第8章 Abstract Factory―関連する部品を組み合わせて製品を作る
 Abstract Factoryパターン
 サンプルプログラム
  抽象的な部品:Itemクラス
  抽象的な部品:Linkクラス
  抽象的な部品:Trayクラス
  抽象的な部品:Pageクラス
  抽象的な工場:Factoryクラス
  工場を使って部品を組み合わせ、製品を作る:Mainクラス
  抽象的な工場:ListFactoryクラス
  抽象的な部品:ListLinkクラス
  抽象的な部品:ListTrayクラス
  抽象的な部品:ListPageクラス
 サンプルプログラムに別の具体的な工場を追加
  抽象的な工場:DivFactoryクラス
  抽象的な部品:DivLinkクラス
  抽象的な部品:DivTrayクラス
  抽象的な部品:DivPageクラス
 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クラス
  Mainクラス
 Compositeパターンの登場人物
 あなたの考えを広げるためのヒント
  複数と単数の同一視
  addはどこに置くべきか
  再帰的構造はあらゆる場面で登場する
 関連しているパターン
 この章で学んだこと
 練習問題

第12章 Decorator−飾り枠と中身の同一視
 Decoratorパターン
 サンプルプログラム
  Displayクラス
  StringDisplayクラス
  Borderクラス
  SideBorderクラス
  FullBorderクラス
  Mainクラス
 Decoratorパターンの登場人物
 あなたの考えを広げるためのヒント
  透過的なインタフェース(API)
  中身を変えずに、機能追加ができる
  動的な機能追加ができる
  単純な品揃えでも、多様な機能追加ができる
  java.ioパッケージとDecoratorパターン
  java.nio.file.Files
 関連しているパターン
 補講:継承と委譲における同一視
  継承-サブクラスとスーパークラスとを同一視
  委譲-自分と委譲先とを同一視
 この章で学んだこと
 練習問題

第6部 構造を渡り歩く
第13章 Visitor―構造を渡り歩きながら仕事をする
 Visitorパターン
 サンプルプログラム
  Visitorクラス
  Elementインタフェース
  Entryクラス
  Fileクラス
  Directoryクラス
  ListVisitorクラス
  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クラス
  ColleagueButoonクラス
  ColleagueTextFieldクラス
  ColleagueCheckboxクラス
  LoginFrameクラス
  Mainクラス
 Mediatorパターンの登場人物
 あなたの考えを広げるためのヒント
  分散が災いになるとき
  通信経路の増加
  再利用できるのは何か?
  GUIプログrマイン具の注意点
 関連しているパターン
 この章で学んだこと
 練習問題

第8部 状態を管理する
第17章 Observer―状態の変化を通知する
 Observerパターン
 サンプルプログラム
  Observerインタフェース
  NumberGeneratorクラス
  RandomNumberGeneratorクラス
  DigitObserverクラス
  GraphObserverクラス
  Mainクラス
 Observerパターンの登場人物
 あなたの考えを広げるためのヒント
  ここにも交換可能性が登場する
  Observerの順序
  Observerの行為がSubjectに影響を与えるとき
  更新のためのヒント情報の扱い
  「観察」よりも「通知」になっている
  Model/View/Controller(MVC)
 関連しているパターン
 この章で学んだこと
 練習問題

第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 GoFによるデザインパターンの分類
付録D デザインパターンQ&A
付録E 参考文献

索引

書籍目次

Posted by shi-n