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.

Javaによる理想のデザインパターン

2,325 views

Published on

JJUG CCC 2016 Fall にて発表したスライド資料です。Java初心者向けのデザインパターン入門講座です。

Published in: Engineering
  • Be the first to comment

Javaによる理想のデザインパターン

  1. 1. Javaによる理想の デザインパターン 関西Javaグループ らしぇる(藤崎 友美) 1
  2. 2. abstrat • デザインパターンとJava • クラス図の見方 • 様々なパターン 2
  3. 3. デザインパターンとJava デザインパターンとは Javaの修飾子で設計を守る Javaの修飾子 3
  4. 4. デザインパターンとは(1/2) • 過去のソフトウェア設計者が編み出した設計ノウハウを蓄 積し、名前を付け、再利用しやすいように特定の規約に 従ってカタログ化したものである(Wikipedia  再利用性  抽象クラスとインタフェース  継承と委譲 4
  5. 5. デザインパターンとは(1/2) • 過去のソフトウェア設計者が編み出した設計ノウハウを蓄 積し、名前を付け、再利用しやすいように特定の規約に 従ってカタログ化したものである(Wikipedia  再利用性  抽象クラスとインタフェース  継承と委譲 とにかく綺麗な設計のプログラムが 作りたいいいぃぃぃぃ!!!! 5
  6. 6. デザインパターンとは(2/2) 大切なこと • やりたいことを明確にする  目的  現状  手段  結果 • パターンを多く知ること  型にあてはめる知識をつける 6
  7. 7. Javaの修飾子で設計を守る デザインパターンを保ちたい だがしかし コーディング規約だけではプログラムは保守 できない • ルールの必要性が理解されない • ルールが多すぎて覚えきれない • 目視で行うレビューに頼っており負担が大きい 7
  8. 8. Javaの修飾子で設計を守る デザインパターンを保ちたい だがしかし コーディング規約だけではプログラムは保守 できない • ルールの必要性が理解されない • ルールが多すぎて覚えきれない • 目視で行うレビューに頼っており負担が大きい 8 プログラムそのものに制限を設けて デザインパターンを守ろう
  9. 9. Javaの修飾子(1/2) • クラス、インタフェース修飾子  abstract:抽象クラス宣言、継承されることを明示する  final:継承されないことを明示する(インタフェースへの付与は不可)  public:すべてのクラスから参照できることを明示する  省略:同一パッケージからのみ参照できることを明示する • メンバ変数修飾子  public:アクセスに制限なし  protected:サブクラスからのみ参照可能  private:同一クラス内からのみ参照可能  省略:同一パッケージからのみ参照可能  static:静的宣言、インスタンス化の影響を受けない変数  final:初期値以外変更できない、固定値宣言  tansient:直列化の時に持続的な記憶領域に保存しない  volatile:スレッド呼び出し時にマスタから作業用へコピーする 9
  10. 10. Javaの修飾子(2/2) • メソッドの修飾子  public:アクセスに制限なし  protected:サブクラスからのみ参照可能  private:同一クラス内からのみ参照可能  省略:同一パッケージからのみ参照可能  static:静的宣言、インスタンス化の影響を受けない変数  final:初期値以外変更できない、固定値宣言  abstract:抽象メソッド宣言、継承先で実装されることを明示する  syncronized:マルチスレッド時に同期を行うメソッド  native:C/C++言語などのプラットフォーム依存する箇所への呼び出し • コンストラクタ  public:アクセスに制限なし  protected:サブクラスからのみ参照可能  private:同一クラス内からのみ参照可能  省略:同一パッケージからのみ参照可能 10
  11. 11. クラス図の見方 クラス 継承 インタフェースの継承 集約 関連依存 11
  12. 12. クラス 12 <<ステレオタイプ>> クラス名 属性(省略可) 操作(省略可) +public -private #protected ~package private
  13. 13. 継承 13 ParentClass ChildClass 三角矢印
  14. 14. インタフェースの継承 14 <<interface>> Printable PrintClass 点線の三角矢印
  15. 15. 集約 15 Color Fruit - color Basket - fruits 四角のついた矢印
  16. 16. 関連依存 16 Uses Creates Notifies 使用する 生成する 通知する
  17. 17. デザインパターン • Iterator • Adapter • TemplateMethod • FactoryMethod • Singleton • Prototype • Builder • AbstractFactory • Bridge • Strategy • Composite 17 • Decorator • Visitor • Chan of Responsibility • Façade • Mediator • Observer • Memento • State • Flyweight • Proxy • Command • Interpreter
  18. 18. デザインパターン • Iterator • Adapter • TemplateMethod • FactoryMethod • Singleton • Prototype • Builder • AbstractFactory • Bridge • Strategy • Composite 18 • Decorator • Visitor • Chan of Responsibility • Façade • Mediator • Observer • Memento • State • Flyweight • Proxy • Command • Interpreter
  19. 19. 様々なパターン クラス 継承 インタフェースの継承 集約 関連依存 19
  20. 20. Singletonパターン • 1つのインスタンスを使いまわす 20 Singleton -singleton -Singleton() +getInstance() Privateコンストラクタ 自信をインスタンスとして持つ 静的(Static)宣言メソッド 継承不可であるため、final 宣言する
  21. 21. 本?匹?個? Iteratorパターン ・繰り返して全ての要素を処理をする 21 <<interface>> Aggregate ConcreteAggregate <<interface>> Iterator ConcreteIterato r Creates +iterator() +iterator() +hasNext() +next() -aggregate +hasNext() +next()
  22. 22. Iteratorサンプルコード Iterator<String> it = new Iterator<String>(); while(it.hasnext()) { string str = it.next(); System.out.println(str); } 22 そう、 java.util. Listは Iteratorパターンである
  23. 23. Template Methodパターン • 具体的な処理をサブクラスに任せる 23 AbstractClass Class +templateMethod() +method1() +method2() +method3() +method1() +method2() +method3() 抽象(abstract)宣言し、 中身は実装しない 継承先で実装を行う 抽象(abstract)宣言する
  24. 24. Prototypeパターン • 型に依存させずにコピーする 24 Client AbstractPrototype ConcretePrototype Uses +createClone() +createClone() ※Clonable宣言を行った場合ののclone()では コピーするインスタンスにより アドレス参照がコピーされるため、 利用するときは注意が必要。
  25. 25. FactoryMethodパターン • インスタンス化をパターン化する 25 Creator ConcreteCreator Product ConcreteProduct Creates +create() -factoryMethod() -factoryMethod() +method1() +method2() +method3() +method1() +method2() +method3() Creates
  26. 26. Abstract Factoryパターン • 関連する部品をまとめてインスタンス化 26 AbstractProduct1 AbstractFactory AbstractProduct2 Creates +createProduct1() +createProduct2() +createProduct3() +doAlpha() +doBeta() AbstractProduct3 +performOne() +performTwo() +executeA +executeB ConcreteProduct1 ConcreteFactory ConcreteProduct2 +createProduct1() +createProduct2() +createProduct3() +doAlpha() +doBeta() ConcreteProduct3 +performOne() +performTwo() +executeA +executeB Creates Creates Creates Creates Creates
  27. 27. Abstract Factoryパターン • 関連する部品をまとめてインスタンス化 27 AbstractFactory ConcreteFactory AbstractProduct** ConcreteProduct** Creates +createProduct1() +createProduct2() +createProduct3() +createProduct1() +createProduct2() +createProduct3() +executeA() +executeB() +executeA() +executeB() Creates
  28. 28. Bridgeパターン • 機能を「継承関係」と「委譲関係」に分けて拡張性を高める 28 Abstraction RefinedAbstraction <<interface>> Implementor ConcreteImplementor -impl #method1() #method2() #method3() +refinedMethodA() +refinedMethodB() +implMethodX() +implMethodY() +implMethodX() +implMethodY() 継承 委譲
  29. 29. Bridgeパターン • 機能を「継承関係」と「委譲関係」に分けて拡張性を高める 29 Display CountDisplay <<interface>> DisplayImpl StringDisplayImpl -impl #open() #draw() #close() +multiDisplay() +rawOpan() +rawPrint() +rawClose() +rawOpen() +rawPrint() +rawClose() 継承 委譲
  30. 30. Adapterパターン1 • APIが違うクラスの互換性をとる 30 ClientC <<interface>> Target Adapter Adaptee Uses extends has +targetMethod1() +targetMethod2() -adaptee +targetMethod1() +targetMethod2() +method1() +method2() +method3()
  31. 31. Adapterパターン2 • APIが違うクラスの互換性をとる 31 ClientC <<interface>> Target Adapter Adaptee Uses imprements extends +targetMethod1() +targetMethod2() +targetMethod1() +targetMethod2() +method1() +method2() +method3()
  32. 32. Builderパターン • 複雑な処理を任せて結果だけ取得する 32 ClientC ConcreteBuilder Director Uses Uses +buildPart1() +buildPart2() +buildPart3() +getResult() -builder +construct() Builder +buildPart1() +buildPart2() +buildPart3()
  33. 33. Strategyパターン • 同じ問題を別の方法で解く 33 Context ConcretStrategy1 <<interface>> Strategy ConcreteStrategy2 -strategy +contextMethod() +strategyMethod() +strategyMethod() +strategyMethod()
  34. 34. Compositeパターン • 容器と中身を同一視して再帰的な構造を作る 34 Client Leaf Component Composite +method1() +method2() +method1() +method2() +add() +remove() +getChild() -children +method1() +method2() +add() +remove() +getChild() Uses
  35. 35. Decoratorパターン • 「飾り付け」を増やす拡張を行う 35 Client ConcreteComponent Component Composite +method1() +method2() +method1() +method2() -component +method1() +method2() Uses ConcreteDecorator +method1() +method2() デコる!
  36. 36. Visitorパターン • 構造を渡り歩いて処理する 36 ConcreteVisitor Visitor Element +visit(ConcreteElement A) +visit(ConcreteElement B) +visit(ConcreteElement A) +visit(ConcreteElement B) +accept(Visitor) ConcreteElementA +accept(Visitor) ConcreteElementB +accept(Visitor) ObjectStructure Uses Uses 繰り返し処理をパターン化
  37. 37. Chain of Responsibilityパターン • 責任のたらい回し(再帰呼び出し) 37 Client ConcreteHandler1 Handler Concretehandler2 +request() -next +request() Request +request()
  38. 38. Facadeパターン • 一連の処理をまとめて入口を一つにする 38 Client ClassA Facade ClassD ClassB ClassC Uses
  39. 39. Mediatorパターン • 相談役に相談して処理する 39 ConcreteColleague3 +concreteColleague3() ConcreteColleague3 +concreteColleague3() ConcreteColleague3 +concreteColleague3() Colleague -mediator +setMediator() +controlColleague() Mediator +createColleagues() +colleagueChanged() ConcreteMediator -concreteColleague1 -concreteColleague2 -concreteColleague3 +createColleagues() +colleagueChanged()
  40. 40. Observerパターン • 状態の変化を全体に通知する 40 Subject ConcreteSubject Observer ConcreteObserver -observers +addObserver() +deleteObserver() +notifyObservers() +getSubjectStatus() +getSubjectStatus() +update() +update() Notifies
  41. 41. Mementoパターン • 状態を保存する 41 Caretaker Originator +createMemento() +restoreMemento() Memento <<wide interface>> +getProtectedInfo() <<narrow interface>> +getPublicInfo() Requests Creates
  42. 42. Stateパターン • 状態が変化するタイミングでクラスを切り替える 42 Context ConcretStrate1 State ConcreteStrate2 -strate +requestX() +requestY() +requestZ() +methodA() +methodB() +methodC() +methodA() +methodB() +methodC() +methodA() +methodB() +methodC()
  43. 43. Flyweightパターン • インスタンスをできるだけ共有させて無駄にnewしない 43 +methodA() +methodB() FlyweightFactory - pool +getFlyweight() Client Flyweight Uses Creates Uses
  44. 44. Proxyパターン • 代理人を立てて必要になってから作る 44 Subject +request1() +request2() +request3() Proxy realSubject +request1() +request2() +request3() RealSubject +request1() +request2() +request3() Client Uses Uses
  45. 45. Commandパターン ・命令を表すインスタンスをまとめて管理する 45 Command ConcreteCommand Invoke Receiver Creates +execute() receiver +execute()+action() Client
  46. 46. Interpreterパターン ・文法規則をクラスで表現する 46 Context AbstractExpression NonterminalExpression Client Creates +getInfoToInterpret() +interpret() +interpret() TerminalExpression +interpret() Uses
  47. 47. 参考書 47
  48. 48. 参考書 48
  49. 49. ご清聴ありがとうございました 49
  50. 50. 50
  51. 51. 補足:テンプレート宣言 • C++ templete<class T> class GenericClass{ private T value: public GenericClass(const T& t); } • Java public class GenericClass<T> {} 51

×