Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

デザインパターン

2,027 views

Published on

デザインパターン

Published in: Internet
  • (Unlimited)....ACCESS WEBSITE Over for All Ebooks ................ accessibility Books Library allowing access to top content, including thousands of title from favorite author, plus the ability to read or download a huge selection of books for your pc or smartphone within minutes ......................................................................................................................... DOWNLOAD FULL PDF EBOOK here { http://bit.ly/2m6jJ5M } ......................................................................................................................... Download Full EPUB Ebook here { http://bit.ly/2m6jJ5M } ......................................................................................................................... Download Full PDF EBOOK here { http://bit.ly/2m6jJ5M }
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • If you want to download or read this book, Copy link or url below in the New tab ......................................................................................................................... DOWNLOAD FULL PDF EBOOK here { http://bit.ly/2m6jJ5M } ......................................................................................................................... Download EPUB Ebook here { http://bit.ly/2m6jJ5M } ......................................................................................................................... Download Doc Ebook here { http://bit.ly/2m6jJ5M } ......................................................................................................................... .........................................................................................................................
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Download or read that Ebooks here ... ......................................................................................................................... DOWNLOAD FULL PDF EBOOK here { http://bit.ly/2m6jJ5M } ......................................................................................................................... Download EPUB Ebook here { http://bit.ly/2m6jJ5M } ......................................................................................................................... Download Doc Ebook here { http://bit.ly/2m6jJ5M } ......................................................................................................................... .........................................................................................................................
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • DOWNLOAD THIS BOOKS INTO AVAILABLE FORMAT (Unlimited) ......................................................................................................................... ......................................................................................................................... Download Full PDF EBOOK here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... Download Full EPUB Ebook here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... ACCESS WEBSITE for All Ebooks ......................................................................................................................... Download Full PDF EBOOK here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... Download EPUB Ebook here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... Download doc Ebook here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... ......................................................................................................................... ......................................................................................................................... .............. Browse by Genre Available eBooks ......................................................................................................................... Art, Biography, Business, Chick Lit, Children's, Christian, Classics, Comics, Contemporary, Cookbooks, Crime, Ebooks, Fantasy, Fiction, Graphic Novels, Historical Fiction, History, Horror, Humor And Comedy, Manga, Memoir, Music, Mystery, Non Fiction, Paranormal, Philosophy, Poetry, Psychology, Religion, Romance, Science, Science Fiction, Self Help, Suspense, Spirituality, Sports, Thriller, Travel, Young Adult,
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • DOWNLOAD THIS BOOKS INTO AVAILABLE FORMAT (Unlimited) ......................................................................................................................... ......................................................................................................................... Download Full PDF EBOOK here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... Download Full EPUB Ebook here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... ACCESS WEBSITE for All Ebooks ......................................................................................................................... Download Full PDF EBOOK here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... Download EPUB Ebook here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... Download doc Ebook here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... ......................................................................................................................... ......................................................................................................................... .............. Browse by Genre Available eBooks ......................................................................................................................... Art, Biography, Business, Chick Lit, Children's, Christian, Classics, Comics, Contemporary, Cookbooks, Crime, Ebooks, Fantasy, Fiction, Graphic Novels, Historical Fiction, History, Horror, Humor And Comedy, Manga, Memoir, Music, Mystery, Non Fiction, Paranormal, Philosophy, Poetry, Psychology, Religion, Romance, Science, Science Fiction, Self Help, Suspense, Spirituality, Sports, Thriller, Travel, Young Adult,
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

デザインパターン

  1. 1. GoFデザインパターン 振る舞いに関するパターン ・Template Method ・Strategy ・Visitor
  2. 2. Template Methodパターン 具体的な処理をサブクラスにまかせる
  3. 3. ○Template Methodパターンとは ・ 端的に言うと、スーパークラスの方に処理の枠組み(テンプレート) を定め、具体的な実装をサブクラスに任せるパターンのこと。 ・ GoFパターンの中でも最も基本的なパターンの1つで、 他のパターンでも多く利用されてます。 Factory MethodパターンやStrategyパターンなど。
  4. 4. ○Template Methodパターンの構造
  5. 5. ○Template Methodパターンの適用タイミング ・ひとつは 共通化を行いたい処理が出てきた場合。 →スーパークラスで処理の共通化を行っている為。 ・もうひとつは、サブクラスで必ず実行して欲しい処理がある場合。 →Template Methodパターンの実装の仕方によって、サブクラスで オーバーライドしなければならないメソッドを制御できる為。 ※つまり、共通部分と差分部分が明確に区別でき、処理に流れが ある場合、サブクラスで実装して欲しい処理がある場合 に、 <Template Methodパターン>の適用を考えるとよい。
  6. 6. ○Template Methodパターンのメリット 1.処理の流れをスーパークラスに集約することで、サブクラスでの 重複した実装を排除することができる。 2.実現したい処理をわかりやすく(簡素化)することができる。 3.サブクラスではオーバーライドすべきメソッドのみを実装し、 処理内容を定義するだけで実現内容を変更できる。
  7. 7. ○Template Methodパターンのデメリット 1.クラスの数が膨大になりやすい Template Methodパターンに凝り過ぎると、子クラスの数が膨大になってしまうことがある。 場合によっては、if文やswitch文で処理を分岐するだけに留め、クラスの数を減らした方が、 却って分かりやすくなることがある。 2.オーバーライドを忘れがち 子クラスでオーバーライドすべき抽象メソッドに対して、親クラスでデフォルト実装があると、 新しい子クラスを作る際に、それらを適切にオーバーライドすることを忘れてしまうことがある。 新しい子クラスを作る際に、既存の子クラスをコピー&ペーストして作ってしまうと、 本当はもっとオーバーライドしないといけないメソッドがあるのに、忘れてしまうことがある。 これを防ぐために、敢えて、親クラスではデフォルト実装を用意しない場合もある。
  8. 8. Strategyパターン アルゴリズムをごっそり切り替える
  9. 9. ○Strategy パターンとは ・Strategyとは「戦略」という意味があり、プログラミングでは 「アルゴリズム」 として考えられている。 どんなプログラムでも、問題を解くために特定のアルゴリズムが 実装されている。 そのアルゴリズムを実装した部分をごっそりと交換できるようにし、 アルゴリズムを切り替えることで、同じ問題を別の方法で解くのを 容易にするのがSterategyパターン。
  10. 10. ○Strategy パターンの構造 インターフェイスか抽象クラスで 定義
  11. 11. ○Strategy パターンの適用タイミング ・アルゴリズムを変更もしくは追加する可能性がある ・要件によって、アルゴリズムを動的に切り替える必要がある ・クライアントとアルゴリズムの結合度を低くしたい (独立性を高くする) ※このような場合、Strategyパターンの採用を検討してみるとよい。
  12. 12. ○Strategy パターンのメリット 1.処理毎にまとめることができる それぞれの処理がクラスにまとめられて実装されており、コードは処理内容専念することが でき、これにより保守性が高まる。 また、新しい処理が追加された場合も、既存のコードに手を入れることなく、新しいクラスを 作成するだけで済む。 2.異なる処理を選択する為の条件文がなくなる。 処理がクラス単位にまとめて実装されることで、結果、if文やswitch文を使うことがなくなり、 非常にすっきりしたコードになる。 3.異なる処理を動的に切り替えることができる。 クラス単位に処理がまとめて実装されているので、クライアントは使いたいクラスのインスタンスを オブジェクトに渡すだけで、処理を動的に切り替えることができる。
  13. 13. ○Strategy パターンのデメリット ・アルゴリズムを組み込むことになるので、 多少、複雑な処理になりがち。(その分コストも増える)
  14. 14. Visitorパターン 構造を渡り歩きながら仕事をする
  15. 15. ○Visitor パターンとは ・「Visitor」という英単語は、「訪問者」を意味する。 このパターンは、「データ構造」と「それに対する処理」を 分離することを目的とするパターンです。 そのためこのパターンを適用すると、「データ構造」を 変更することなしに、「新しい処理」を追加することができる。 ・具体的には、訪問者であるVisitor役のオブジェクトが、 訪問先であるデータ構造要素の個々のオブジェクトを訪問し、 その訪問先の公開されている資源を利用して処理を実行して回る という形になる。
  16. 16. ○Visitor パターンの構造 処理の部分 データ構造の部分
  17. 17. ○Visitor パターンの適用タイミング ・データの構造が複合・複雑である場合。 ・振る舞いが複合・複雑である場合。 ・機能を拡張する可能性がある場合。 ※このような場合に、Visitorパターンを利用すると良い。
  18. 18. ○Visitor パターンのメリット 1.クラスの部品としての独立性を高める データ構造と操作を分離することにより、独立して開発する ことが可能になる。 2.データ構造のクラスを変更することなく、操作側の機能を 容易に拡張できる。
  19. 19. ○Visitor パターンのデメリット 1.Visitor未使用時(普通のデータとそれに対する処理が纏まったクラス)と比べて コードが複雑になる。 2.訪問者側に処理を追加するのは容易だが、データ構造側に処理を 追加する場合に、訪問者の受け入れを常に考慮する必要がでてくる。 3.訪問者に処理を行ってもらうには必要な情報を公開しなければならないが、 必要以上に情報を公開してしまうとデータの隠ぺいが崩れたり、 データ構造の改良が難しくなる。
  20. 20. GoFデザインパターン 生成を目的とするパターン ・Singleton ・Factory Method ・Abstract Factory
  21. 21. Singleton いくつ作るかを制限する
  22. 22. Singletonパターンとは  Singletonパターンは、オブジェクトの生成に関連 するパターンです。  あるクラスに対してインスタンスが1つしか存在しな いことを保証し、 それにアクセスするためのグロー バルな方法を提供 します。
  23. 23. メリット1  Singletonパターンを適用すると、インスタンスが1 つしか生成されないことが保証されます。このため、 開発者は「一度しかnewしてはならない」といった余 計な事を考えずに済むようになります。
  24. 24. メリット2  オブジェクトを生成するnewは非常に負荷のかかる処理ですので、使 いまわしが効くオブジェクトを毎回newするのはパフォーマンス上問題 です。このようにオブジェクトの生成数を制限したいときは、シングルト ンパターンの出番です。このパターンを使えば、オブジェクトを外部から 直接生成させることを防ぐことができ、クラス自体に同時に生成できる オブジェクトの数を管理する機能を持たせることができます。
  25. 25.  Singletonパターンのポイントは、「コンストラクタを privateにしてしまう」ことです。そして、唯一のイン スタンスをprivateな static変数として保持して おくのです。こうすることで、そのクラスがJava仮想 マシンへロードされたときに、一度だけインスタンス が生成されま す。そして、これ以後、インスタンスの 生成は構造上不可能になります。インスタンスの取 得には、専用のstaticメソッドを用意します。 Singletonパターンのポイント1
  26. 26. Singletonパターンのポイント2  サブクラスを作られると Singleton 型を持つ他のクラスができ、その インスタンスを作るとシングルトン性が保証されないため、class 宣言 に final 指定をする
  27. 27. 使用例 public final class MySingleton { // このクラスに唯一のインスタンス private static MySingleton instance = new MySingleton(); private MySingleton() {} // インスタンス取得メソッド public static MySingleton getInstance() { return instance; } // 以後、通常のフィールドやメソッドの宣言 ...中略... } public class Sample { MySingleton mySingleton = Mysingleton.getInstance(); // 以後、通常のフィールドやメソッドの宣言 …略... }
  28. 28. マルチスレッドにおける注意  マルチスレッドプログラムにおいては、シングルトンを初期化するメソッ ドは、複数のインスタンスが生成されないよう、なんらかの形でロックの 仕組みを使わなければならない。
  29. 29. 対応策  複数のスレッドによってシングルトンのインスタンスが複数生 成されてしまう問題に対処するために、getInstance() を synchronized メソッドにする(但し、性能が劣化する)。 class MySingleton { private static MySingleton Instance; private MySingleton() {} // 遅延初期化 public static synchronized MySingleton getInstance() { if (Instance == null) { Instance = new MySingleton(); } return Instance; } }
  30. 30. Factory Method インスタンスを生成する工場
  31. 31. FactoryMethodパターンとは • オブジェクトを生成するときのインタフェース だけを規定して、実際どのクラスを インスタン ス化するかはサブクラスが決めるようにする。 Factory Methodパターンは、 インスタンス 化をサブクラスに任せる。
  32. 32. Factory Methodパターンは、オブジェクトの生成の方法 に注目したパターンです。Factory Methodパターンとは、 その名の通り「工場」のような振る舞いをします。何を作る工 場かというと、「クラスのインスタンス」という製品を製造する 工場です。 さて、この「Factory」で生成される「オブジェクト」はどのよ うに実装されているのかはわかりませんが、どのように実装 されていても、同様の「機能」を提供します。この同様の「機 能」を実現するために「インターフェース」を定義し、Factory で生成されるクラスが実装を行っています。言い換えると、 Factoryで生成されるインスタンスはどのクラスのものであ れ、同様の「機能」を持っていると言えます。 Factory Methodパターンを利用することで、オブジェクト の利用側はどのインスタンスが返ってくるのかを知る必要が なくなります。繰り返しになりますが、利用側が知る必要があ るのは製品の「機能」であり、具体的にどのクラスのインスタ ンスであるかを知る必要はありません
  33. 33. • オブジェクトを生成する場合、下記のように記述する のが普通です。 • しかし、このようなオブジェクト生成方法では、十分 に満足のいく結果が得られないことがあります。 そ こで、FactoryMethodパターンでは、オブジェクト の生成を担うメソッド(factory method)を通して間 接的にオブジェクトを生成します。 Product product = new Product(); public Product factoryMethod(){ return new Product(); }
  34. 34. Factory Methodのメリット • オブジェクトの生成処理と使用処理を分離で きる • オブジェクトの利用側とオブジェクトのクラス の結びつきを低くする
  35. 35. オブジェクトの生成処理と使用処理を分離できる と は • 複数のオブジェクトを扱う場合、if文やswitch文を使ってオブジェクトの生成コードを記述し、それら を利用するコードも同じコード内に記述してしまいがちです。こういった場合、オブジェクト生成の コードと利用側のコードを分けておくと、後々のメンテナンスが楽になります。 • Factory Methodパターンは、「オブジェクト生成側」と「オブジェクトの利用側」を分離するパターン です。「オブジェクト生成側」はCreatorクラスと ConcreteCreatorクラス、「オブジェクト利用側」は クライアント側のコードがそれぞれ担います。その間をやりとりするオブジェクトが、 Productクラス とConcreteProductクラスになります。これにより、生成側はProductクラスを返すコード、一方 の利用側はProductクラスを利用するコードを記述するだけで良くなり、それぞれの処理内容に 専念することができます。
  36. 36. public class FileSaverFactory { public static FileSaver createSaver(int saveType) { FileSaver fileSaver = null; if (saveType == FileTypeConstants.CSV_FILE_TYPE) { fileSaver = new CSVFileSaver(); } else if (saveType == FileTypeConstants.HTML_FILE_TYPE) { String encoding = System.getProperty("data.encoding"); fileSaver = new HTMLFileSaver(encoding); } return fileSaver; } } // FileSaver を利用するクライアントクラス public class ParticipationList implements Aggregate { public void save(int saveType) throws Exception { // .....略 ..... // シンプルなファクトリクラスのスタティックメソッドを呼び出す FileSaver fileSaver = FileSaverFactory.createSaver(saveType); fileSaver.save(this); // .....略 ..... } } ・Factoryクラス(生成側) ・利用者側
  37. 37. オブジェクトの利用側とオブジェクトのクラスの結び つきを低くする とは • Factory Methodパターンを使用することで、オブジェクトの利用側とオ ブジェクトの結びつきを低くする事 ができます。これは、利用側でオブ ジェクトを直接生成しない、つまり、利用側のコードに「new クラス名」と 直接書かなくてすむ、ということを意味します。この結果、利用側とオブ ジェクトの結びつきがゆるくなります。たとえば、生成するクラスの種類 や生成手順が変更された場合でも、ファクトリ側を手直しするだけですみ ます。
  38. 38. 実例 public abstract class CutPrint{ protected abstract void draw( Cuttable hanzai ); protected abstract void cut( Cuttable hanzai ); protected abstract void print( Cuttable hanzai ); public void createCutPrint(){ Wood hanzai = new Wood(); draw( hanzai ); cut( hanzai ); print( hanzai ); } } 下線を引いている部分では、どのクラスのインスタンスが生成されるかは決定したくありませ ん。 なぜなら、生成するインスタンスの実際の型を決めてしまうと、サブクラスで自由に生成するイ ンスタンスの型を決定することができないからです。 createCutPointをサブクラスでオーバーライドすれば、サブクラスで自由にインスタンスの型を 決定することができますが、これでは、Template Methodの利点が失われてしまいます。 さてどうすればいいでしょう?
  39. 39. public abstract class CutPrint{ protected abstract void draw( Cuttable hanzai ); protected abstract void cut( Cuttable hanzai ); protected abstract void print( Cuttable hanzai ); protected Cuttable createCuttable(){ return new Wood(); } public void createCutPrint(){ Cuttable hanzai = createCuttable(); draw( hanzai ); cut( hanzai ); print( hanzai ); } } これを解決する方法として、FactoryMethod パターンが与えられます。 FactoryMethod パターンでは、インスタンス生成のためのメソッドを用意します。そし て、そのインスタンスを生成するためのメソッドを通してインスタンスの生成を行いま す。 次のページで、実際の実装例を示します
  40. 40. このように、インスタンスを生成するメソッドを通して、インスタンスを生成するようにし ておくことで、 createCuttable メソッドをオーバーライドするメソッドを記述し、 インス タンスの型を自由に選択することができるようになります。 public class ImagawasCutPrint extends CutPrint{ protected void draw(Cuttable hanzai){ System.out.println("マンガの絵を描く"); } protected void cut(Cuttable hanzai){ System.out.println("彫刻刀を利用して器用に彫る"); } protected void print(Cuttable hanzai){ System.out.println("インクとして、自分の血を使いプリントする"); } protected Cuttable createCuttable(){ return new Potato(); } }
  41. 41. Factory Methodパターンの構造
  42. 42. Abstract Factory 関連する部品をまとめて作る工場
  43. 43. はじめに 「abstract factory」を直訳すると「抽象的な工場」となります。抽象的な工場・・・これは一体何な のでしょうか? GoFパターンの一つにFactory Methodパターンがあります。Factory Methodパターンは 製品であるオブジェクトを作る「工場」を用意するパターンです。ここで見ていくAbstract Factory パターンも同様にオブジェクトを生成するパターンの1つで、関連し合うオブジェクトの集まり、つまり 部品の集まりを生成します。 ここで、「抽象的な」というところがポイントです。この工場は「抽象的」な工場で、生成される部品も 「抽象的」なものになります。 オブジェクト指向プログラミングでは、「物を抽象化する」ということが重要なポイントとなります。つ まり、具体的な物を直接扱うのではなく、「具体的な物を抽象化した物」を扱うということです。 Abstract Factoryパターンは、具体的なクラスを明確にすることなく、関連し合うオブジェクトの 集まりを生成するパターンです
  44. 44. Abstract Factoryパターン とは Abstract Factoryパターンでは、部品の役割を持つクラスとその部品を作る工 場の役割を持つクラスが存在します。 ただし、その工場には関連し合う部品を生成するためのメソッドがそれぞれ用意 されます。また、関連し合う部品群の種類に応じて、その工場自身も「工場を生成 するための工場」によって生成されます。 これにより、状況に応じて生成される具体的な部品群を切り替えることができま す。 まとめると、Abstract Factoryパターンでは工場から生成される部品は抽象化 されており、部品の具体的な内容や生成手順をクライアントが意識しなくて済むよ うになります。
  45. 45. Abstract Factoryパターンの目的  互いに関連したり依存し合うオブジェクト群を、その具象クラスを明確 にせずに 生成するためのインターフェースを提供する。
  46. 46. Abstract Factoryパターンのメリット  具体的なクラスをクライアントから隠蔽する  クライアントは具体的な工場や部品に直接アクセスするのではなく、抽象化され た工場や部品のAPIのみを使って部品オブジェクトを生成したりアクセスしたり できます。このため、クライアントを変更することなく、具体的な工場や部品を変 更することが可能です。  利用する部品群の整合性を保つ  関連し合うオブジェクトを扱う場合、その整合性を保つことが重要になります。 Abstract Factoryパターンを適用することで、オブジェクト群の整合性を容易 に保つことができます。
  47. 47. Abstract Factoryパターンのメリット  部品群の単位で切り替えができる  ConcreteFactoryクラスは関連する部品の集まりを生成します。つまり、 ConcreteFactoryクラスを切り替えることで、関連する部品の集まりを容易に 切り替えることができます。
  48. 48. Abstract Factoryのクラス図
  49. 49. 役割り  1. AbstractProduct1・2・3(抽象的な製品)  「AbstractFactory」(抽象的な工場)によって生成される抽象的なオブジェクト(部品・製品)のインタフェー スを定義します。  2. ConcreteProductA1・A2・A3、ConcreteProductB1・B2・B3(具体的な製品)  「AbstractProduct1・2・3」のインタフェースを実装します。  3. AbstractFactory(抽象的な工場)  「AbstractProduct1・2・3」を生成するためのインタフェースを定義します。 ※Factoryオブジェクト「ConcreteFactoryA」「ConcreteFactoryB」(具体的な工場)を生成するための クラスメソッドを定義します。  4. ConcreteFactoryA・ConcreteFactoryB(具体的な工場)  「AbstractFactory」のインタフェースを実装します。  5. Client(利用者)  「AbstractProduct1・2・3」「AbstractFactory」が提供するインタフェースのみを使用して処理を行いま す。
  50. 50. AbstractProduct1.java public abstract class AbstractProduct1 { protected String name; public AbstractProduct1(String name) { this.name = name; } public abstract void execute(); }
  51. 51. AbstractProduct2.java public abstract class AbstractProduct2 { protected String name; public AbstractProduct2(String name) { this.name = name; } public abstract void run(); }
  52. 52. AbstractProduct3.java public abstract class AbstractProduct3 { protected String name; public AbstractProduct3(String name) { this.name = name; } public abstract void action(); }
  53. 53. ConcreteProductA1.java public class ConcreteProductA1 extends AbstractProduct1 { public ConcreteProductA1(String name) { super(name); } public void execute() { System.out.println(name + " 完成(A1-execute)!"); } }
  54. 54. ConcreteProductA2.java public class ConcreteProductA2 extends AbstractProduct2 { public ConcreteProductA2(String name) { super(name); } public void run() { System.out.println(name + " 完成(A2-run)!"); } }
  55. 55. ConcreteProductA3.java public class ConcreteProductA3 extends AbstractProduct3 { public ConcreteProductA3(String name) { super(name); } public void action() { System.out.println(name + " 完成(A3-action)!"); } }
  56. 56. ConcreteProductB1.java public class ConcreteProductB1 extends AbstractProduct1 { public ConcreteProductB1(String name) { super(name); } public void execute() { System.out.println(name + " 完成(B1-execute)!"); } }
  57. 57. ConcreteProductB2.java public class ConcreteProductB2 extends AbstractProduct2 { public ConcreteProductB2(String name) { super(name); } public void run() { System.out.println(name + " 完成(B2-run)!"); } }
  58. 58. ConcreteProductB3.java public class ConcreteProductB3 extends AbstractProduct3 { public ConcreteProductB3(String name) { super(name); } public void action() { System.out.println(name + " 完成(B3-action)!"); } }
  59. 59. AbstractFactory.java public abstract class AbstractFactory { public static AbstractFactory createFactory(int factoryId){ switch(factoryId){ case ConcreteFactoryA.id: return new ConcreteFactoryA(); case ConcreteFactoryB.id: return new ConcreteFactoryB(); default: return null; } } public abstract AbstractProduct1 createProduct1(); public abstract AbstractProduct2 createProduct2(); public abstract AbstractProduct3 createProduct3(); }
  60. 60. ConcreteFactoryA.java public class ConcreteFactoryA extends AbstractFactory { public static final int id = 1; public AbstractProduct1 createProduct1() { return new ConcreteProductA1("工場A - 製品1"); } public AbstractProduct2 createProduct2() { return new ConcreteProductA2("工場A - 製品2"); } public AbstractProduct3 createProduct3() { return new ConcreteProductA3("工場A - 製品3"); } }
  61. 61. ConcreteFactoryB.java public class ConcreteFactoryB extends AbstractFactory { public static final int id = 2; public AbstractProduct1 createProduct1() { return new ConcreteProductB1("工場B - 製品1"); } public AbstractProduct2 createProduct2() { return new ConcreteProductB2("工場B - 製品2"); } public AbstractProduct3 createProduct3() { return new ConcreteProductB3("工場B - 製品3"); } }
  62. 62. Client.java public class Client { public static void main(String[] args) { List<AbstractFactory> factorys = new ArrayList<AbstractFactory>(); factorys.add(AbstractFactory.createFactory(ConcreteFactoryA.id)); factorys.add(AbstractFactory.createFactory(ConcreteFactoryB.id)); Iterator<AbstractFactory> it = factorys.iterator(); while (it.hasNext()){ AbstractFactory factory = it.next(); AbstractProduct1 product1 = factory.createProduct1(); AbstractProduct2 product2 = factory.createProduct2(); AbstractProduct3 product3 = factory.createProduct3(); product1.execute(); product2.run(); product3.action(); } } }
  63. 63. 実行結果 C:¥sample¥desin_pattern¥abstract_factory>javac Client.java [Enter] C:¥sample¥desin_pattern¥abstract_factory>java Client [Enter] 工場A - 製品1 完成(A1-execute)! 工場A - 製品2 完成(A2-run)! 工場A - 製品3 完成(A3-action)! 工場B - 製品1 完成(B1-execute)! 工場B - 製品2 完成(B2-run)! 工場B - 製品3 完成(B3-action)!
  64. 64. Factory Method との違い  「Factory Method」パターンは、『オブジェクト生成』の抽象化にポイ ントを置いたパターンであるのに対し、「Abstract Factory」パターン は、『関連するオブジェクト郡をまとめて生成するための手順』の抽象 化にある。
  65. 65. GoFデザインパターン 構造に関するパターン3種
  66. 66. Adapter パターン
  67. 67. • 継承・委譲をすることで、使えなかった処理を 使えるようにするパターン • 既存のクラスに手を加えずに互換性の無いク ラスを組み合わせることが出来る • 後から処理を足すのに便利 特徴
  68. 68. Composite パターン
  69. 69. 特徴 • 共通した処理を決めておくことで、単一オブ ジェクトとオブジェクトの集合を区別せずに良 くなる • 共通するインターフェースを持つので、後から 処理を変更し辛い
  70. 70. Flyweight パターン
  71. 71. 特徴 • インスタンスを使いまわすことでメモリを節約する(使用するメ モリ領域を共有する) • 処理負荷を減らす(newで生成するのに掛かる時間を短縮す る)

×