「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。 -[[戻る>.NET開発]] * 目次 [#r7a0f009] #contents *概要 [#u54dfdc4] -過去のソフトウェア設計者が発見し編み出した設計ノウハウを蓄積し、~ 名前をつけ、再利用しやすいように特定の規約に従ってカタログ化したもの。 -[[GoF>#gdfdb360]]やCode Completeなどの書籍が有名。 **GoFパターン [#gdfdb360] -多数のソフトウェアパターンの中で最も広く知られている。 -GoFとは、書籍『オブジェクト指向における再利用のためのデザインパターン』の著者である、~ エーリヒ・ガンマ、リチャード・ヘルム、ラルフ・ジョンソン、ジョン・ブリシディースの4人を指す。 **注意および批判 [#jee32c0d] -よく使われる設計を一般化された形で(コンセプトとして)まとめたもの。 -サンプルコードは、実装例に過ぎない。 -デザインパターンは、すべての状況における最善の設計ではない。 -デザインパターンをむやみに適用するのは不適切で、コードの複雑さを無意味に高める。 -一部のデザインパターンは、プログラミング言語の機能の欠損の印と主張されることがある。 *詳細 [#vc04c6fb] .NETのクラスライブラリの中でどのように使用されているかなどの例を上げらながら、ぼちぼち書き足していく。 **生成に関するパターン [#of2bac53] ***Abstract Factory [#s5cb14c9] -関連する一連のインスタンスを状況に応じて、適切に生成する方法を提供する。 ***Builder [#x108671e] -接続文字列を生成するSqlConnectionStringBuilderなど。 -複合化されたインスタンスの生成過程を隠蔽する。 ***Factory Method [#b1dbb8d4] -データ プロバイダのインスタンスを生成するDbProviderFactoryなど。 -実際に生成されるインスタンスに依存しない、インスタンスの生成方法を提供する。 ***Prototype [#gaac8a02] -ICloneable.Clone(), Object.MemberwiseClone()などがある。 -同様のインスタンスを生成するために、原型のインスタンスを複製する。 ***Singleton [#b471a479] -GetInstance メソッドを持つクラス、WCFのIInstanceProviderインターフェイスなどが該当。 -あるクラスについて、インスタンスが単一であることを保証する。 **構造に関するパターン [#t95490e2] ***Adapter [#hebab451] -TableAdapter、DataAdapterなどがある。 -元々関連性のない2つのクラスを接続するクラスを作る。 ***Bridge [#h1d2d0fa] -クラスなどの実装と、呼出し側の間の橋渡しをするクラスを用意し、実装を隠蔽する。 ***Composite [#i85291a3] -例えば、DataTableはDataColumnやDataRowなどから構成される。~ 多数のUI Controlをホストする、Form(Windows FormsやWeb Forms)なども。 -再帰的な構造を表現する。複雑なオブジェクトモデルを持つオブジェクト。 ***Decorator [#v3f8a090] -System.IO.Streamクラス系のデコレート・パターンが有名(ファイルIO+暗号化など)。 -あるインスタンスに対し、動的に付加機能を追加する。Filterとも呼ばれる。 ***Facade [#x4521138] -業務系では、Transactionルートを定義する際にしようされる。 -複数のサブシステムの窓口となる共通のインタフェースを提供する。 ***Flyweight [#xd8cd6df] -多数のインスタンスを共有し、インスタンスの構築のための負荷を減らす。 ***Proxy [#r5dcba5a] -[[透過プロキシ>.NETにおいてAOPを実現する透過プロキシ]](System.Runtime.Remoting.Proxies.RealProxy)などで利用されている。 -共通のインタフェースを持つインスタンスを内包し、利用者からのアクセスを代理する。Wrapperとも呼ばれる。 **振る舞いに関するパターン [#m75410c4] ***Chain of Responsibility [#d0d1a4c6] -イベントの送受信を行う複数のオブジェクトを鎖状につなぎ、それらの間をイベントが渡されてゆくようにする。 ***Command [#w39f63cc] -複数の異なる操作について、それぞれに対応するオブジェクトを用意し、オブジェクトを切り替えることで、操作の切替えを実現する。 ***Interpreter [#h8bb0b34] -構文解析のために、文法規則を反映するクラス構造を作る。 ***Iterator [#h545307c] -配列、Collection、Genericなど、沢山のものがある。 --System.Collections.IList、System.Collections.Generic.IList(T)インターフェイス --System.Collections.IEnumerator、System.Collections.Generic.IEnumerator(T) インターフェイス --System.Collections.IEnumerable、System.Collections.Generic.IEnumerable(T) インターフェイス --System.Collections.ICollection、System.Collections.Generic.ICollection(T) インターフェイス -複数の要素を内包するオブジェクトのすべての要素に対して、順番にアクセスする方法を提供する。反復子。 ***Mediator [#a609fe99] -オブジェクト間の相互作用を仲介するオブジェクトを定義し、オブジェクト間の結合度を低くする。 ***Memento [#afe52f42] -データ構造に対する一連の操作のそれぞれを記録しておき、以前の状態の復帰または操作の再現が行えるようにする。 ***Observer (出版-購読型モデル) [#gd97bb35] -[[Reactive Extensions(Rx)]]などが有名。 -インスタンスの変化を他のインスタンスから監視できるようにする。Listenerとも呼ばれる。 ***State [#v4b944ab] -オブジェクトの状態を変化させることで、処理内容を変えられるようにする。 ***Strategy [#ifdf850f] -[[IoC、AOP → DI → 依存性反転原則>#y4d32e7a]] -データ構造に対して適用する一連のアルゴリズムをカプセル化し、アルゴリズムの切替えを容易にする。 ***Template Method [#ca09b857] -[[IoC、AOP → DI → 依存性反転原則>#y4d32e7a]] -あるアルゴリズムの途中経過で必要な処理を抽象メソッドに委ね、その実装を変えることで処理が変えられるようにする。 ***Visitor [#ecff5de4] -データ構造を保持するクラスと、それに対して処理を行うクラスを分離する。 **マルチスレッドプログラミングに関するパターン [#fed89734] ***Active Object (Actor) [#p6a3f471] ***Future [#o650f287] ***Guarded suspension [#l273ef76] -System.ThreadingSpinLock構造体、逆セマフォなど。 -前提条件が満たされるまで待機するための機構。 ***Lock [#q67d7cf5] -WindowsOSのスレッド同期ツールキットを使う、lockステートメントやSystem.Threading.Mutex、Semaphoreクラスなどがある。 -リソースに対して1つのスレッドが「ロック」をかけて、その間は他のスレッドがそのリソースにアクセスしたり変更を加えたりできないようにする。 -参考 --マルチスレッドで高速なC#を書くためのロック戦略~ https://qiita.com/tadokoro/items/28b3623a5ec58517d431 ***Monitor [#b0c6d20a] -名前の通り、System.Threading.Monitor クラスがある。 -排他的に実行しなければならないメソッド群を持つオブジェクトをスレッドセーフに利用できるようにするための機構。 ***Producer-consumer [#zb8f28aa] -System.Threading.ThreadPool クラスがある。 -「生産者」 (producer) スレッド群がデータを生成して「通信路」に追加し、「消費者」 (consumer) スレッド群がそのデータを「通信路」から取り出して処理するという構造。 ***Reactor [#o8c416b0] ***Readers-writer lock [#rbe06a3e] -System.Threading.ReaderWriterLockがある。 -書き込みは排他アクセスが必要だが、読み込みは並行に行えるようにしたい場合のためのロック機構。 ***Scheduler [#b51f5b66] -WindowOSにノンプリエンプティブなマルチタスク、協調的マルチタスクを実現するための~ ファイバー(fiber)があるが、.NETにはない(マイクロスレッドで実装することはできる)。 -シングルスレッドで実行される処理の実行を各スレッドに許可するタイミングを明確に制御する。 -参考 --[サンプル] イテレータとマイクロスレッド - C# によるプログラミング入門 | ++C++; // 未確認飛行 C~ https://ufcpp.net/study/csharp/sp2_microthread.html ***Thread pool [#la91c241] -名前の通り、System.Threading.ThreadPool クラスがある。 -多数のスレッドを作成して、それらに多数のタスクを処理させる。一般に、[[Producer-consumer>#zb8f28aa]]パターンを使って実現される。 ***Thread-specific storage [#d3119598] -WindowのOS機能にTLS: Thread Local Storageがある。 -この、TLSには、ThreadStatic属性やThreadLocalオブジェクト経由でアクセス可能。 -静的変数・グローバル変数のように扱えるがスレッドごとに異なる内容を格納できるメモリ領域を提供する。 ***Two-phase termination [#g04364a8] *参考 [#k80f2538] -デザインパターン (ソフトウェア) - Wikipedia~ https://ja.wikipedia.org/wiki/%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2) **C#とJavaによるデザインパターンへのお誘い [#j6bccc68] https://www.hyuki.com/pi/ -Factory Methodパターン(2002年12月号) -Template Methodパターン(2003年1月号) -Generation Gapパターン(2003年2月号) -Null Objectパターン(2003年3月号) -Thread-Specific Storageパターン(2003年4月号) -Producer-Consumerパターン(2003年5月号) -Single-Active-Instance Singletonパターン(2003年6月号) -Multi-Phase Startupパターン(2003年7月号) -Mock Objectパターン(2003年8月号) -Model-View-Controllerパターン(2003年9月号) -Fork/Joinパターン(2003年10月号) -Essenceパターン(2003年11月号) **C#で学ぶデザインパターン入門 - Qiita [#u3feb80b] -Iterator~ http://qiita.com/toshi0607/items/cdc589c58f21c0fc513d -Adapter~ http://qiita.com/toshi0607/items/374373a8bd656f7188d4 -Template Method~ http://qiita.com/toshi0607/items/cc8a87a3049bd7af52df -Factory Method~ http://qiita.com/toshi0607/items/d95bdd31da363e0f04a9 -Singleton~ http://qiita.com/toshi0607/items/c172bb4478e72ae6ced7 -Prototype~ http://qiita.com/toshi0607/items/f4358020befca048d2e0 -Builder~ http://qiita.com/toshi0607/items/13e37d54e04b61bc69b5 -AbstractFactory~ http://qiita.com/toshi0607/items/b8a19a4328849cdf1d99 -Bridge~ http://qiita.com/toshi0607/items/13e37d54e04b61bc69b5 -Strategy~ http://qiita.com/toshi0607/items/72829d34ef9595f5b3b0 -Composite Pattern~ -Decorator Pattern~ http://qiita.com/toshi0607/items/a65d1abb95a97970ab8c **[[IoC、AOP → DI → 依存性反転原則]] [#y4d32e7a] ---- Tags: [[:プログラミング]], [[:.NET開発]]