Upgrade to Pro — share decks privately, control downloads, hide ads and more …

「Java言語で学ぶ デザインパターン入門」を 読んでみた / I read "Introduction to Design Patterns Learned in the Java Language"

「Java言語で学ぶ デザインパターン入門」を 読んでみた / I read "Introduction to Design Patterns Learned in the Java Language"

「Java言語で学ぶ デザインパターン入門」という有名な書籍を読んでみました。そこで学んだことを紹介します。

silverbirder

June 26, 2019
Tweet

More Decks by silverbirder

Other Decks in Technology

Transcript

  1. 概要 - 設計ノウハウ – 23パターン 書籍『オブジェクト指向における再利用のためのデザインパターン』において、GoF (Gang of Four; 四人組)

    と呼ばれる4人の共著者は、(略) その書籍の中で23種類のパターンを取り上げ た。(※) - 補足  『オブジェクト指向における再利用のためのデザインパターン』から Java言語  で説明したものが『 Java言語で学ぶデザインパターン入門』 6 ※ https://ja.wikipedia.org/wiki/デザインパターン_(ソフトウェア))
  2. 概要 - パターン一覧 - 生成 (5 pattern) パターン名 概要 Abstract

    Factory 関連する一連のインスタンスを状況に応じて、適切に生成 する方法を提供する。 Builder 複合化されたインスタンスの生成過程を隠蔽する。 Factory Method 実際に生成されるインスタンスに依存しない、インスタンス の生成方法を提供する。 Prototype 同様のインスタンスを生成するために、原型のインスタン スを複製する。 Singleton あるクラスについて、インスタンスが単一であることを保証 する。 7
  3. 概要 - パターン一覧 - 構造 (7) パターン名 概要 Adapter 元々関連性のない2つのクラスを接続するクラスを作る。

    Bridge クラスなどの実装と、呼出し側の間の橋渡しをするクラス を用意し、実装を隠蔽する。 Composite 再帰的な構造を表現する。 Decorator あるインスタンスに対し、動的に付加機能を追加する。 Filterとも呼ばれる。 Facade 複数のサブシステムの窓口となる共通の インタフェースを 提供する。 Flyweight 多数のインスタンスを共有し、インスタンスの構築のため の負荷を減らす。 Proxy 共通のインタフェースを持つインスタンスを内包し、利用者 からのアクセスを代理する。Wrapperとも呼ばれる。 8
  4. 概要 - パターン一覧 - 振る舞い - 1 (6) パターン名 概要

    Chain of Responsibility イベントの送受信を行う複数のオブジェクトを鎖状につなぎ、それらの間をイベントが渡さ れてゆくようにする。 Command 複数の異なる操作について、それぞれに対応するオブジェクトを用意し、オブジェクトを切 り替えることで、操作の切替えを実現する。 Interpreter 構文解析のために、文法規則を反映するクラス構造を作る。 Iterator 複数の要素を内包するオブジェクトのすべての要素に対して、順番にアクセスする方法を 提供する。反復子。 Mediator オブジェクト間の相互作用を仲介するオブジェクトを定義し、オブジェクト間の結合度を低く する。 Memento データ構造に対する一連の操作のそれぞれを記録しておき、以前の状態の復帰または操 作の再現が行えるようにする。 9
  5. 概要 - パターン一覧 - 振る舞い - 2 (5) パターン名 概要

    Observer (出版-購読型モデル) インスタンスの変化を他のインスタンスから監視できるようにする。 Listenerとも呼ばれる。 State オブジェクトの状態を変化させることで、処理内容を変えられるようにする。 Strategy データ構造に対して適用する一連のアルゴリズムをカプセル化し、アルゴリズムの切替え を容易にする。 Template Method あるアルゴリズムの途中経過で必要な処理を抽象メソッドに委ね、その実装を変えること で処理が変えられるようにする。 Visitor データ構造を保持するクラスと、それに対して処理を行うクラスを分離する。 10
  6. 学習 - 具体例 - 数え上げ public class Main { public

    static void main(String[] args) { BookShelf bookShelf = new BookShelf(4); bookShelf.appendBook(new Book("Around the World in 80 years")); bookShelf.appendBook(new Book("Bible")); bookShelf.appendBook(new Book("Cinderella")); bookShelf.appendBook(new Book("Daddy-Long-Legs")); Iterator it = bookShelf.iterator(); while (it.hasNext()) { Book book = (Book)it.next(); System.out.println(book.getName()); } } } 19
  7. 学習 - 具体例 - 数え上げ public class Main { public

    static void main(String[] args) { BookShelf bookShelf = new BookShelf(4); bookShelf.appendBook(new Book("Around the World in 80 years")); bookShelf.appendBook(new Book("Bible")); bookShelf.appendBook(new Book("Cinderella")); bookShelf.appendBook(new Book("Daddy-Long-Legs")); Iterator it = bookShelf.iterator(); while (it.hasNext()) { Book book = (Book)it.next(); System.out.println(book.getName()); } } } 20 数え上げ BookShelfに依存しない
  8. 学習 - 具体例 - 監視 public class Main { public

    static void main(String[] args) { NumberGenerator generator = new RandomNumberGenerator(); Observer observer1 = new DigitObserver(); generator.addObserver(observer1); generator.execute(); } } 21
  9. 学習 - 具体例 - 監視 - 変更 public class Main

    { public static void main(String[] args) { NumberGenerator generator = new RandomNumberGenerator(); Observer observer1 = new DigitObserver(); Observer observer2 = new GraphObserver(); generator.addObserver(observer1); generator.addObserver(observer2); generator.execute(); } } 22 監視を追加
  10. 学習 - 具体例 - 考え方 public class Main { public

    static void main(String[] args) { Player player1 = new Player("Taro", new RandomStrategy()); Player player2 = new Player(”Takashi", new LearningStrategy()); for (int i = 0; i < 10000; i ++) { Hand nextHand1 = player1.nextHand(); Hand nextHand2 = player2.nextHand(); // hand judge ... } } } 23
  11. 学習 - 具体例 - 考え方 - 変更 public class Main

    { public static void main(String[] args) { Player player1 = new Player("Taro", new RandomStrategy()); Player player2 = new Player(”Takashi", new RandomStrategy()); for (int i = 0; i < 10000; i ++) { Hand nextHand1 = player1.nextHand(); Hand nextHand2 = player2.nextHand(); // hand judge ... } } } 24 考え方を交換
  12. 感想 - 書籍を通して ・ 人のノウハウを得ることによって、モノの見方が増え、問題解決の手法の幅が広がった。 - 機能の修正を行う際のアプローチが増えた。 ・ 部品の再利用によって、テスト工数の削減につながる点が良いと感じた。 -

    システム規模が増す毎に「部品の管理」というデメリットも学んだ。 ・ プログラムだけでなく、別のものにもデザインパターンを当てたい。 - 設計書の部品化・・?再利用・・? 26