序文
-私たちはあなたに、比較的単純なパターン伝えるために、今日導入前のシングルトンパターン工場モデル(工場出荷時の方法、)、工場出荷時のモデル、それが何ですか?名前が示すように、工場-地元のものを製造します。その後、アプリケーションがどのようにプログラムでそれらを使用するには、彼らはどのような効果を再生できますか?なぜ工場のモデルはいますか?
我々はOCPの原則は、(クローズド原則を開く)、拡張のために開いていることを言う前に、この原則の変更のため閉鎖。優秀な工場モード、オブジェクトクラスと優れたパッケージに反映しました。タグの間の結合を低減するように。よりスケーラブル。
ファクトリパターンの紹介
まず、その理由
私たちのプログラムの中だけでなく、作成したオブジェクトを作成するには、常にオブジェクトの変更を伴う、(追加または変更)いくつかのクラスに直面しているが、ニーズの変化に起因します。次に、どのようにこの問題に対処するには?
簡単なパッケージメカニズム提供ファクトリパターンは、変更するオブジェクトを隔離します。変更は、需要に影響を与えません前に、この時間は、件名を変更します。
第二に、意図
オブジェクトを作成するためのインターフェイスを定義しますが、サブクラスが技術をインスタンス化するクラスを決めましょう。FactoryMethodは、そのサブクラスを遅らせるために、クラスのインスタンスを作成します。
第三に、図の場合。
ファクトリモードは、次のコンポーネントで構成されています。
(1) 、抽象工場(クリエイター):植物を定義するために必要な基本的なルールをコピーし、任意の他の特定の植物がこの抽象工場を継承していました
(2) 、(コンクリートによるコンクリート工場_ クリエイター):特定の製品を作成するために、その定義の抽象ファクトリの実装を拡張
(3)抽象製品(製品を):基本的な方法とルール定義された製品をコピーし、すべての製品は、特定の製品この抽象クラスに基づいていました
(4) 、(コンクリートによって特定の製品_ 製品):継承された抽象的製品、コンクリートプラントによって作成された抽象メソッドのその定義は、2つの1対1の関係です。
第四に、工場出荷時のモデルコードの実装
ここでは、例の工場モデルを通じてルールと使用方法をご紹介します。ファクトリモードでは、抽象工場と工場固有の実装を定義することは継承された抽象メソッドが抽象製品クラスの製品を作成するために、特定の製品を受け継いで呼び出します。
ここでは、それの以下の例を見て携帯電話を製造します:
名前空間ConsoleApp4 { パブリック クラスFactory_Method_Pattern { } #regionの 製品========================= /// <要約> /// 抽象クラスの携帯電話 / // </要約> パブリック 抽象 クラス電話 { パブリック 抽象 文字列の作成(); } /// <まとめ> /// 詳細Huawei社の携帯電話クラス /// </要約> パブリック クラスHuawei社:電話 { /// <要約> /// 抽象メソッドを実装します /// </要約> /// <戻り値> </戻り> パブリック オーバーライド 文字列作成() { リターン " Huaweiの一世俗" ; } } /// <まとめ> /// 特定の製品カテゴリキビ電話 @ / </要約> パブリック クラス小米科技:電話 { /// <要約> /// 抽象メソッドを実装する /// </要約> /// </戻り値> <返し>を 公共の オーバーライド 文字列を作成します() { リターン "一つの世俗キビ」; } } #Endregionの #regionの 植物========================= /// <まとめ> /// 抽象ファクトリクラス /// </概要> パブリック 抽象 クラスの工場の { /// <要約> /// 方法抽象ファクトリクラス、製品の作成コール /// </要約> /// <>> </戻り値を返します パブリック 抽象電話CreatePhone(); } /// <要約> /// 詳細Huawei社ファクトリクラスは、抽象ファクトリクラスを継承 /// </要約> パブリック クラスHuaweiFactoryを:工場の { /// <まとめ> /// 継承方法 /// </要約> /// </戻り> <返し>を パブリック オーバーライド電話CreatePhone() { 戻り 新しい新)(ファーウェイと、 } } /// <まとめ> /// 詳細キビファクトリクラスは、抽象ファクトリクラスを継承する /// </要約> パブリック クラス工場の:XiaomiFactory { /// <要約> /// 継承方法 /// </要約> /// <戻り値> </リターン> 公共 オーバーライド電話CreatePhone() { 戻り 新しい新;小米科技() } } #endregionを }
クラスプログラム { 静的な 無効メイン(文字列[] argsを) { // 初期化植物 工場のhuaweiFactory = 新新HuaweiFactory(); // 特定の電話Huawei社の生産 するvar結果= huaweiFactory.CreatePhone(); // Huawei社の携帯電話世俗 のvar答え= 結果.create(); Console.WriteLineを(答え); 工場のxiaomiFactory = 新新XiaomiFactory(); 結果 = xiaomiFactory.CreatePhone(); 答え =result.Create(); Console.WriteLineを(答え)。 Console.ReadLine(); } }
上記の場合、同じことが第1の携帯電話抽象抽象クラスであり、携帯電話は確かに薄い空気から表示されません。したがって、抽象ファクトリクラスにする必要があります。ファクトリクラスは、クラスの携帯電話メーカーの異なるサブクラスを導出しました。同じ携帯電話はまた、別のブランドを導き出します。そして、対応するクラスの携帯電話メーカーは、携帯電話に携帯電話のブランドを製造しました。その後、我々は、携帯電話端末のブランドを追加する必要があり、我々は、ファクトリクラスと製品カテゴリを変更する必要はありません。私たちは別のものを追加することができます。これは、元の実行には影響を与えません。例えば、我々はMeizuの電話を追加する必要があります。
#region新しいMeizuの電話================ /// <要約> /// 新しいMeizuのファクトリクラス /// </要約> パブリック クラスMeizuFactory:工場の { 公共 オーバーライド電話CreatePhoneは、() { 返す 新しい新しいMeizuの(); } } /// <要約> /// Meizuの電話の特定の製品カテゴリの追加 /// </要約> パブリック クラスMeizuの:電話 { 公共 オーバーライド 文字列(作成)を { リターン 「世俗Meizuの一つ」。 } } #Endregion
クライアントがそれに呼び出したときに呼び出され、以下を追加します。
工場meizuFactory = 新しいMeizuFactory(); 結果 = meizuFactory.CreatePhone()。 答 = result.Create(); Console.WriteLineを(答え)。
使用シナリオと長所と短所
このモードでは、特定のオブジェクトを作成するために、すべての作業は、拡大戦略を達成するために、達成するために、サブクラスで遅延されます。OCPは、原則的に対応しています。
ファクトリモードは、「単一のオブジェクト」の問題を解決することを目的とします。ユーザおよびオブジェクトクラス分離の特定のタイプとの間の結合。デカップリングの一定の程度を達成するために。
(A)使用シナリオ
1、ユーザーが製品のクラス名を知っている必要はありませんか、時間はどのように作成する際に気にしないとき。私達はちょうどそれがとき、コンクリート工場に作成されたことを知っておく必要があります。
2、タスクは、クライアントが製品を作成することとなっているの使用を心配する必要がない場合、複数の工場でオブジェクトを作成するために委託します。あなたは、動的に指定する必要がある場合。
(ii)の利点
1、プログラミング方法は、クライアントの呼び出しは、私たちが作成する方法について心配する必要はありません、特定の工場の製品を知っている必要はありません。
2は、唯一のクラスの工場と製品カテゴリを追加する必要がある場合、製品が増える需要の増加は、元のコードを変更する必要はありません。これは、簡単に拡張することができます。
(C)短所
増加した製品は、追加のファクトリクラスおよび製品カテゴリが追加されます。2つのクラスを追加する製品を追加します。ある程度までは、システムの複雑さを増加させました。しかし、また、クラス間の依存関係を強化します。どこが悪いの問題です
概要
各デザインパターンは、乱用しないように対応する機会を持っています。私たちは、デザインパターンを学ぶように、我々はまた、元の主な研究のための基準として、それを必要とします。これは、原則に違反してはなりません。デザインモードで - 工場のモデルには、工場出荷時のサブクラスで、遅延実行に委託タスクのオブジェクトを作成します。問題を解決するためにシステムを拡張することは困難でなく、特定のクラスとオブジェクトの間の結合を減少させます。また、変更、閉鎖拡張オープンの原理を実装しています。
何の使用はありませんので、この社会は、文句を言わない、不公平です!人々は常に進歩を反映しています!
次のFanger魏コードをスキャンすることを歓迎し、私はデザインパターンが通過する道に足を踏み入れました!