ホーム > Java言語で学ぶデザインパターン入門 > (旧版)Java言語で学ぶデザインパターン入門 | 検索 | 更新情報 |
読者の声 | デザインパターン・メーリングリスト | マルチスレッド編 | 著書 |
こちらのページは、 旧版の『Java言語で学ぶデザインパターン入門』のサポートページです。ご注意ください。 最新情報は、 『増補改訂版Java言語で学ぶデザインパターン入門』のページをごらんください。
|
こんにちは、結城浩です。 ここは、(旧版)の 『Java言語で学ぶデザインパターン入門』 (ソフトバンクパブリッシング刊) のホームページです。
本書は、デザインパターンというものをやさしく解説した本です。 デザインパターンの原典に登場する23個のパターンすべてについて、 Java言語によるサンプルプログラムをつけています。
本書に関連して、 デザインパターン・メーリングリストも運営されています。 情報交換にぜひどうぞご参加ください。
本書は、以下のような方にお勧めできる本です。
『Java言語で学ぶデザインパターン入門』 結城浩 著 ソフトバンクパブリッシング刊 ISBN4-7973-1646-2 定価\3,800円(本体価格)
どなたでも、 本書のサンプルプログラムを以下からダウンロードできます。
アーカイブファイルを展開後、 readme.txt(Windows)またはreadme.euc(UNIX)ファイルをお読み下さい。
以下は修正版のソースです。
以下は修正された図です。
アーカイブに含まれているファイルは 以下のThe zlib/libpng License に従って取り扱ってください。
Copyright (C) 2001 Hiroshi Yuki. https://www.hyuki.com/dp/ hyuki@hyuki.com
This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.
Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
(参考訳)
このソフトウェアは現状のまま提供されるものであり、 明示的にあるいは暗黙のうちにどんな保証もしない。 このソフトウェアを使うことによって生じるいかなる損害に対しても、 作者はまったく責任を負わない。
以下の制限を守る限りにおいて、誰であっても、 このソフトウェアを商用アプリケーションを含む任意の目的に使用すること、 このソフトウェアを変更すること、そして自由に再配布することができる。
1. このソフトウェアの起源を誤って提示してはならない。すなわち、 あなたは元のソフトウェアを自分が書いたと主張してはならない。 もしもこのソフトウェアを製品の中で使用するときには、製品の文書中で 謝意を示すことは歓迎する。しかしそれは必須ではない。
2. 変更したソースの版ははっきりとそれがわかるようにしなければならず、 元のソフトウェアと混同されるようにしてはいけない。
3. いかなるソース配布からも、この注意書きは削除したり変更したりしてはならない。
質問は、 フォームまたは メーリングリストへどうぞ。返事はお約束できませんが、どんなことでもお気軽に。
質問
p.25 「バージョンアップと互換性」で、Adaptee役とTarget役の記述が逆ではないですか?
回答
いいえ、逆ではありません。
p.26にある図(Fig.2-7)の右側を見ていただくとわかるように、 ここで「与えられている」のは新しい版(Version 2.0)の MyClassなのです。
MyClassをバージョンアップした。 でも古い版を利用しているプログラムがある。 そういうときにAdapterパターンを使うとどうなるか、 というのがご指摘の文章の主旨ですから、 新しい版がAdaptee役、古い版がTarget役になります。
もしこれが、MyClassはVersion 1.0のままで、 Adapterパターンを使ってVersion 2.0のプログラムを動かす、 という話なら、ご指摘の通りになります。 フィードバックを感謝します。
質問
p.44 問題3-3の問題文の「スーパークラス」は、 「サブクラス(および同一パッケージ内のクラス)」の誤りですか?
回答
いいえ、誤りではありません。
これはTemplate Methodパターンの問題ですね。 サンプルプログラムでは、open, print, closeを呼び出しているのは、 テンプレートメソッドdisplayです。 displayはfinalメソッドで、スーパークラスAbstractDisplayで 実装されています。
ですから、スーパークラスから open, print, closeを呼び出している ことになります。
もちろん、ご質問のような問題文にしても正しいことは正しいですが、 Template Methodパターンからは少しはずれてしまいます。 Template Methodパターンは継承を使い、 「スーパークラスのメソッドが、サブクラスのメソッドを呼び出す」 というところがポイントですので。
====================================================================== (2002-11-06) p.398 List A7-5 (読者からの指摘。感謝します)(第4刷での誤り) 誤: Director director = new Director(framebuilder()); 正: Director director = new Director(framebuilder);
====================================================================== (2002-10-07) p.150 List 10-8 (読者からの指摘。感謝します) 誤:InsertSorterクラス (InsertSorter.java) 正:SelectionSorterクラス(SelectionSorter.java) 誤:class InsertSorter 正:class SelectionSorter
====================================================================== (2002-09-16) p.141 9行目。(読者からの指摘。感謝します) 誤:この2つの式の 正:この3つの式の
====================================================================== (2002-05-13) p.249およびp.427 colleagueChangedメソッド [DP/ML:1507] 阿部さんのご指摘によります。感謝します。
誤: // Colleageからの通知で各Colleageの有効/無効を判定する。 public void colleagueChanged(Colleague c) { if (c == checkGuest || c == checkLogin) { if (checkGuest.getState()) { // Guest mode textUser.setColleagueEnabled(false); textPass.setColleagueEnabled(false); buttonOk.setColleagueEnabled(true); } else { // Login mode textUser.setColleagueEnabled(true); userpassChanged(); } } else if (c == textUser || c == textPass) { userpassChanged(); } else { System.out.println("colleagueChanged:unknown colleague = " + c); } } 正: // Colleageからの通知で各Colleageの有効/無効を判定する。 public void colleagueChanged(Colleague c) { if (checkGuest.getState()) { // Guest mode textUser.setColleagueEnabled(false); textPass.setColleagueEnabled(false); buttonOk.setColleagueEnabled(true); } else { // Login mode textUser.setColleagueEnabled(true); userpassChanged(); } }
====================================================================== (2002-04-05) p.437 List A19-3 [DP/ML:1465] 高橋さんのご指摘によります。感謝します。
誤: if (9 <= hour && hour < 17) { context.changeState(DayState.getInstance()); } else if (12 <= hour && hour < 13) { context.changeState(NoonState.getInstance()); } 正: if (12 <= hour && hour < 13) { context.changeState(NoonState.getInstance()); } else if (9 <= hour && hour < 17) { context.changeState(DayState.getInstance()); }
====================================================================== (2002-04-05) p.279 Fig.18-4 [DP/ML:1465] 高橋さんのご指摘によります。感謝します。
誤: <<wide interface>> getPublicInfo <<narrow interface>> #getProtectedInfo 正: <<wide interface>> #getProtectedInfo <<narrow interface>> +getPublicInfo
====================================================================== (2002-04-05) p.272 Fig.18-1 [DP/ML:1465] 高橋さんのご指摘によります。感謝します。 誤: bet createMemento restoreMemento 正: +bet +createMemento +restoreMemento ====================================================================== (2002-01-15) p.41 誤: (Barbara Liskov, Data Abstraction and Hierarchy, SIGPLAN Notices. 23(5), May 1988) http://www.objectmentor.com/publications/lsp.pdf 正: (Robert C. Martin C++ Report, March 1996) http://www.objectmentor.com/publications/lsp.pdf ====================================================================== (2002-01-10) p.150 List 10-7 誤: import java.util.Comparator; 正: (削除) ※注意:import java.lang.Comparable; も、なくてかまいませんが、 読者にComparableの所在を知らせるために記述しています。 ====================================================================== (2001-12-17) p.331 Fig.21-4 (Proxyの図) 誤: (ClientからProxyへ矢印) 正: (ClientからSubjectへ矢印) ====================================================================== (2001-11-02) p.273, p.274 [DP/ML:1130] 村山さんのご指摘によります。感謝します。 誤:Gamer.java public void restoreMemento(Memento memento) { // アンドゥを行う this.money = memento.money; this.fruits = memento.fruits; } 正:Gamer.java public void restoreMemento(Memento memento) { // アンドゥを行う this.money = memento.money; this.fruits = memento.getFruits(); } また、Memento.javaに以下を追加 Vector getFruits() { return (Vector)fruits.clone(); } ====================================================================== (2001-09-23) p.465 誤: import java.awt.*; 正: p.464ですでにimport宣言されているので不要。 ====================================================================== (2001-08-30) 第7章 全般 誤: (DirectorからgetResultを呼んでいる) 正: (ClientからgetResultを呼ぶ)
====================================================================== (2001-07-04) p.xxxvi 1行目 誤: java.util.Iteratorは、…クラスです。 正: java.util.Iteratorは、…インタフェースです。 ====================================================================== (2001-07-02) p.401 誤: Fig.A8-1 listfactoryを使ったYahoo!へのリンク(java Main Listfactoryで作成) Fig.A8-2 tablefactoryを使ったYahoo!へのリンク(java Main tablefactoryで作成) 正: Fig.A8-1 listfactoryを使ったYahoo!へのリンク Fig.A8-2 tablefactoryを使ったYahoo!へのリンク 作成手順はjava Main listfactory.ListFactoryおよびjava Main tablefactory.TableFactoryですが、 冗長なので削除します。 ====================================================================== (2001-06-26) p.442 誤: Fig.A20-5のようになる… 正: Fig.A20-2のようになる… ====================================================================== (2001-06-20) p.242 誤: Fig.16-8の:ColleagueCheckboxに長方形が重なってしまっている。 正: 重ならないようにすべき。 ====================================================================== (2001-06-20) p.472 誤: https://www.hyuki.com/jb/ というURLが[Coad]の中に置かれている。 正: https://www.hyuki.com/jb/ というURLは[Yuki]の中に置くべき。 ======================================================================
『Java言語で学ぶデザインパターン入門』はインターネットで公募したレビューアによって、 執筆と並行してレビューが行われました。
本書の「中国繁体版」が翻訳・出版されました。
本書の「韓国版」が翻訳・出版されました。
あなたのご意見・感想をお送りください。 あなたの一言が大きなはげみとなりますので、どんなことでもどうぞ。
書籍中の誤りのご指摘やご質問も歓迎いたします。 よろしければ、 デザインパターン・メーリングリストもどうぞ。
There is at the back of every artist's mind, a pattern or type of Architecture. - G.K. Chesterton