Java言語で学ぶデザインパターン入門
◆デザインパターン入門書の決定版!◆
現在、オブジェクト指向設計/プログラミングを行う上で、「デザインパターン」の知識は必要不可欠です。本書『Java言語で学ぶデザインパターン入門』は、プログラミング言語の書籍で定評のある結城浩が、Javaプログラマ全般、特にオブジェクト指向の初心者を対象に、全23のデザインパターンをわかりやすく説き明かした入門書です。
本書では、各パターンにつき1章を割いて、Java言語によるサンプルプログラムを示し、デザインパターンの考え方を丁寧に解説しています。付属CD-ROMには、本文で紹介するサンプルプログラムを全て収録。
◆R.U.Certainマガジン「結城浩にインタビュー」はこちら◆
【関連書籍】 Java言語で学ぶデザインパターン入門 マルチスレッド編
【目次】
- 第1部 デザインパターンに慣れる
- 第1章 Iterator-1つ1つ数え上げる
- サンプルプログラム
- Aggregateインタフェース/Iteratorインタフェース/Bookクラス/BookShelfクラス/BookShelflteratorクラス/Mainクラス
- Iteratorパターンの登場人物
- あなたの考えを広げるためのヒント
- 実装がどうであれ、Iteratorを考える/抽象クラスやインタフェースはどうも苦手で…/AggregateとIteratorの対応/「次」は間違いやすい/「最後」も間違いやすい/複数のIterator/イテレータの種類いろいろ/deletelteratorは不要/
- 関連しているパターン
- この章で学んだこと
- 第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章 Factory Method-インスタンス作成をサブクラスにまかせる
- 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クラス/HTMLBilderクラス/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クラス、実装のクラス階層:Displaylmplクラス・StringDisplaylmplクラス、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クラス/Acceptorインタフェース/Entryクラス/Fileクラス/Directoryクラス/ListVisitorクラス/FileTreatmentExceptionクラス/Mainクラス/Visitor側とAcceptor側の相互呼び出し
- Visitorパターンの登場人物
- あなたの考えを広げるためのヒント
- ダブルディスパッチ/なぜこんなに複雑なことをするのか/The Open-Closed Principle-拡張については開き、修正については閉じる/ConcreteVisitor役の追加は簡単/ConcreteAcceptor役の追加は困難/Visitorが処理するためには何が必要か
- 関連しているパターン
- 第14章 Chain of Responsibility
- Chain of Responsibilityパターン
- サンプルプログラム
- Troubleクラス/Supportクラス/NoSupportクラス/LimitSupportクラス/OddSupportクラス/SpecialSupportクラス/Mainクラス
- Chain of Responsibilityパターンの登場人物
- あなたの考えを広げるためのヒント
- 要求を出す人と要求を処理する人をゆるやかに結びつける/動的に連鎖の形態を変える/自分の仕事に集中できる・たらい回しで処理は遅くならないのか
- 関連しているパターン
- 第7部 シンプルにする
- 第15章 Facade-シンプルな窓口
- Facadeパターン
- サンプルプログラム
- Databaseクラス/HtmlWriterクラス/PageMakerクラス/Mainクラス
- Facadeパターンの登場人物
- あなたの考えを広げるためのヒント
- Facade役がやっていることは何だろう/再帰的なFacadeパターンの適用/プログラマがFacadeを作らない理由-心理的要因
- 関連しているパターン
- 第16章 Mediator-相手は相談役1人だけ
- Mediatorパターン
- サンプルプログラム
- Mediatorインタフェース/Colleagueインタフェース/ColleagueButtonクラス/ColleagueTextFieldクラス/ColleagueCheckboxクラス/LoginFrameクラス/Mainクラス
- あなたの考えを広げるためのヒント
- 分散が災いになるとき/通信経路の追加/再利用できるのは何か?
- 関連しているパターン
- 第8部 状態を管理する
- 第17章 Observer-状態の変化を通知する
- Observerパターン
- サンプルプログラム
- Observerインタフェース/NumberGeneratorクラス/RandomNumberGeneratorクラス/DigitObserverクラス/GraphObserverクラス/Mainクラス
- Observerパターンの登場人物
- あなたの考えを広げるためのヒント
- ここにも交換可能性が登場する/Observerの順序/Observerの行為がSubjectに影響を与えるとき/更新のためのヒント情報の扱い/「観察」よりも「通知」になっている/Model/View/Controller(MVC)
- 補講:java.util.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クラス/BigStringクラス/Mainクラス
- Flyweightパターンの登場人物
- あなたの考えを広げるためのヒント
- 複数箇所に影響が及ぶ/intrinsicとextrinsic/管理されているインスタンスは、ガベージコレクションされない
- 第21章 Proxyパターン
- サンプルプログラム
- Printerクラス/Printableインタフェース/PrinterProxyクラス/Mainクラス
- あなたの考えを広げるためのヒント
- 代理人を使ってスピードアップ/代理人と本人を分ける必要はあるのか/代理と委譲/透過的ということ/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 参考文献
【結城浩のプログラミングレッスン】
本シリーズは、結城浩のプログラミング入門書をまとめたものです。プログラミング知識ゼロの読者にも理解できるように、平易な文章で、やさしくかみ砕いて解説しています。練習問題の解答も、詳細な解説がついていますので、独習に最適です。
■本書は学校、企業向けのテキスト教材として最適です。
一括購入のご相談は下記メールアドレスに御問い合わせください。
E-mail:ordersbp@softbank.co.jp