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.

B4-6 Prototype pattern

17 views

Published on

B4ゼミ 第6章 Prototype pattern

Published in: Education
  • Be the first to comment

  • Be the first to like this

B4-6 Prototype pattern

  1. 1. Java言語で学ぶ デザインパターン入門 深沢研究室 M0 稲垣 有哉 第6章 Prototypeパターン 1
  2. 2. 1 2 3 2 Prototypeパターンとは INDEX サンプルプログラム まとめ INDEX
  3. 3. 3 Prototypeパターンとは
  4. 4. 4 Prototypeパターンとは new Something() 必ずクラス名を指定する必要あり 原型となるインスタンスを複製して新しいインスタンスを作る クラスからインスタンスを作る Somethingクラスのインスタンスを作成する時
  5. 5. 5 サンプルプログラム
  6. 6. 文字列を枠線で囲ったり下線で引いて表示したりする インスタンスの複製を行い、描写する “ Hello, world. ” ~~~~~~~~~ *************** * Hello, world. * *************** サンプルプログラムについて 6 /////////////// / Hello, world. / /////////////// “ Hello, world. ” ////////////
  7. 7. 名前 説明 Product 抽象メソッドuseとcreateCloneが宣言され ているインタフェース Manager createCloneを使ってインスタンスを複製 する命令を出すクラス MessageBox 文字列を枠線で囲って表示するクラス UnderlinePen 文字列に下線を引いて表示するクラス Main 動作テスト用のクラス クラスとインタフェース一覧 7
  8. 8. Productインタフェース package framework; import java.lang.Cloneable; public interface Product extends Cloneable { public abstract void use(String s); public abstract Product createClone(); } 複製のためのメソッドを定めるインタフェース clone()メソッドを使用するために継承 抽象メソッド サブクラスで具体的に指定 8
  9. 9. package framework; import java.util.*; public class Manager { private HashMap showcase = new HashMap(); public void register(String name, Product proto) { showcase.put(name, proto); } public Product create(String protoname) { Product p = (Product)showcase.get(protoname); return p.createClone(); } } Managerクラス 対応しているインスタンスを 取得して複製 プロダクトインタフェース を利用してインスタンスの複製を行う インスタンスの名前とインスタンスの対 応関係をjava.util.HashMapとして表現 与えられた1組(キーと要 素)をshowcaseに登録 9
  10. 10. import framework.*; public class MessageBox implements Product { private char decochar; public MessageBox(char decochar) { this.decochar = decochar; } public void use(String s) { int length = s.getBytes().length; for (int i = 0; i < length + 4; i++) { System.out.print(decochar); } System.out.println(""); System.out.println(decochar + " " + s + " " + decochar); for (int i = 0; i < length + 4; i++) { System.out.print(decochar); } System.out.println(""); } public Product createClone() { Product p = null; try { p = (Product)clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return p; } } MessageBoxクラス 囲む文字列を取得 文字を装飾する処理 自分自身の複製を行うメソッド cloneメソッドでコピーを行う java.lang.Cloneableインタフェースを実装しているため可能 cloneメソッドは自分のクラスからしか呼び出せない 10 *************** * Hello, world. * ***************
  11. 11. UnderlinePenクラス import framework.*; public class UnderlinePen implements Product { private char ulchar; public UnderlinePen(char ulchar) { this.ulchar = ulchar; } public void use(String s) { int length = s.getBytes().length; System.out.println("¥"" + s + "¥""); System.out.print(" "); for (int i = 0; i < length; i++) { System.out.print(ulchar); } System.out.println(""); } public Product createClone() { Product p = null; try { p = (Product)clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return p; } } 下線の文字列を取得 文字を装飾する処理 自分自身の複製を行うメソッド cloneメソッドでコピーを行う java.lang.Cloneableインタフェースを実装しているため可能 cloneメソッドは自分のクラスからしか呼び出せない 11 “ Hello, world. ” ~~~~~~~~~
  12. 12. Mainクラス import framework.*; public class Main { public static void main(String[] args) { // 準備 Manager manager = new Manager(); UnderlinePen upen = new UnderlinePen('~'); MessageBox mbox = new MessageBox('*'); MessageBox sbox = new MessageBox('/'); manager.register("strong message", upen); manager.register("warning box", mbox); manager.register("slash box", sbox); // 生成 Product p1 = manager.create("strong message"); p1.use("Hello, world."); Product p2 = manager.create("warning box"); p2.use("Hello, world."); Product p3 = manager.create("slash box"); p3.use("Hello, world."); } } 12 製品の名前と インスタンスを与える 実際にインスタンスの複 製を行う 名前 クラスとインスタンスの内容 “strong message” UnderlinePenでulcharが’ ~ ’ “warning box” MessageBoxでdecocharが’ * ’ “slash box” MessageBoxでdecocharが’ / ’
  13. 13. 実行結果 import framework.*; public class Main { public static void main(String[] args) { // 準備 Manager manager = new Manager(); UnderlinePen upen = new UnderlinePen('~'); MessageBox mbox = new MessageBox('*'); MessageBox sbox = new MessageBox('/'); manager.register("strong message", upen); manager.register("warning box", mbox); manager.register("slash box", sbox); // 生成 Product p1 = manager.create("strong message"); p1.use("Hello, world."); Product p2 = manager.create("warning box"); p2.use("Hello, world."); Product p3 = manager.create("slash box"); p3.use("Hello, world."); } } "Hello, world." ~~~~~~~~~~~~~ ***************** * Hello, world. * ***************** ///////////////// / Hello, world. / ///////////////// 13 名前 クラスとインスタンスの内容 “strong message” UnderlinePenでulcharが’ ~ ’ “warning box” MessageBoxでdecocharが’ * ’ “slash box” MessageBoxでdecocharが’ / ’
  14. 14. 14 まとめ
  15. 15. Prototypeパターンの登場人物 Prototype(原型)の役 ConcretePrototype(具体的な原型)の役 Client(利用者)の役 →インスタンスのコピーを実際に実装MessageBoxクラス UnderlinePenクラス Productインタフェース Managerクラス →インスタンスをコピーするメソッドを利用して新しいインスタンスを作る →インスタンスをコピーして新しいインスタンス を作るためのメソッドを定める 15
  16. 16. Prototypeパターンが有効な場面(利点) ・種類が多すぎてクラスにまとめられない場合 ・クラスからのインスタンス作成が難しい場合 ・フレームワークと生成するインスタンスを分けたい場合 →別々のクラスにするとクラス数が多くなってしまう →ユーザー操作により作成された複雑な図形など →インスタンスのコピーを行う部分をframeworkパッケージに 収めているためクラス名の束縛がない 16
  17. 17. 関連しているパターン ・Flyweightパターン(20章) ・Mementoパターン(18章) ・Compositeパターン(11章)とDecoratorパターン(12章) ・Commandパターン(22章) →1つのインスタンスを複数の場所で共有 →スナップショットとアンドゥを行うために現在のインスタンスの状態を保存 →複雑な構造のインスタンスが動的に作られることがある →命令を複製するときに使用される場合がある 17
  18. 18. 参考文献 1) 結城浩 増補改訂版Java言語で学ぶデザインパターン入門 SBクリエイティブ2004 18
  19. 19. framework Manager showcase register create <<interface>> Product use createClone UnderlinePen ulchar use createClone MessageBox decochar use createClone Users
  20. 20. Client Prototype createClone ConcretePrototype createClone Users

×