.NETのデザインパターン(2):ファクトリメソッドパターン

ファクトリメソッドモデル(ファクトリメソッドパターン)

はじめに:
では、単純なファクトリパターン、我々が述べたように、プラントモデルの方法があり、単純なファクトリパターン拡張、設計Gof23デザインパターンのパターンを作成するために属します。これは、ソフトウェアの設計における問題を解決し、関連するオブジェクトを作成するために残っています。これは、より良いハンドル、顧客のニーズに変更することができます。

紹介
「を続けるために私たちを新新」の問題は、我々は持っている、単純なファクトリパターン、場合に私たちは事前に知られているように、我々のニーズに応じて、オブジェクトの作成を担当するファクトリクラスに延期するオブジェクトをインスタンス化の作業をダイナミックな製品カテゴリを作成します。しかし、我々は無制限であり、お客様が変更、制限されている予測します。だから、問題がある、私たちの予知を超えた顧客の変化と、私たちは、ソースコードを変更する必要があります。このデザインパターンが許可されていない、どのようにそれを行うには?Factory Methodパターンは、このような問題を解決することです。
問題:我々の要求を満たすことができない具体的な工場労働者階級を作成し、雇用創出は、変更された
変更、パッケージは次のとおりです。ソリューション。特定の植物は、カプセル化されました。

定義
もまた、仮想コンストラクタ(仮想コンストラクタ)モードまたはマルチモード工場出荷時の状態(多形工場)、Factory Methodパターンとして知られている工場出荷時のモデルとして知られているFactory Methodパターンを、親はその後、サブクラスのオブジェクトを作成するために、パブリックインターフェイスを定義するための責任がある、と特定のオブジェクトを生成するための責任であり、その目的は、サブクラス(作成)クラスをインスタンス化するかどうかを決定するために、即ち完了サブクラスにクラスインスタンス化演算子を遅らせることです。

意図は
オブジェクトを作成するためのユーザーインターフェイスを定義しますが、サブクラスが技術をインスタンス化するクラスを決定させるために、Factory Methodパターンは、そのサブクラスにクラスの遅延をインスタンス化します。

参加者

  • 抽象製品の役割(プロダクト)
    製品定義インタフェース
  • 特定の製品(ConcreteProduct)の役割
    インターフェース製品の特定の製品カテゴリを実装します
  • 抽象ファクトリーの役割(クリエイター)
    ステートメントファクトリメソッド(FactoryMethod)、製品を返品します
  • 実際の工場(ConcreteCreator)
    クライアントによって呼び出さ実現FactoryMethodファクトリメソッドの例は、製品を返品します

Factory MethodパターンUMLダイアグラム
図ファクトリメソッドUML

の実際の生活の例
の理解を容易にするために、私はまだ服に尊敬の動きの一例を着用してください。この例では、単純なファクトリパターンの例では、多少異なります。
これは、各衣服(、清朝の皇帝は非常に贅沢なドレスがあると言われて、特定の製品カテゴリ(メイドによる)具体的なファクトリクラス専用)は、それぞれの追加洋服(ように特定の製品カテゴリよりパーセントで、)女性(具体的なファクトリクラス)が、その職務、互いに独立。皇帝の理由は、それが服のためであるので、拡張性が非常に強いです、そうすることを()。

解析
機能が実装さ:皇帝の、あまりにも厳しい、これらの服は、ちょうどメイドを追加されていない場合には、皇帝の要件に応じて、動的に作成は、服をすでに(服を)存在する特定の製品を(女性によってピックアップ)私たちは彼の要求を満たすことができるようになります。各衣服を追加するために、唯一の女性の衣服(高凝集)を担当して、以前のすべてと女性のための洋服のために、(デザインモードが必要な)影響を受けません。ここで、問題が理解されていないFactory Methodパターンが解像して適用することができますか?ああ。あなたは今、簡単な工場パターンよりも柔軟性を考えなければなりません。

抽象ファクトリーの役割コード

 1 名前空間 FactoryMethod
 2 {  3。/// <まとめ>  4つの。///  製品へのインタフェースを定義する抽象ファクトリクラス 5。/// </要約>  6。パブリックインターフェイス IFactoryです 7。{  8。        iCoat CreateCoat();  9     } 10 }
     
    
     

     
    


抽象製品コードの役割

 1 名前空間 FactoryMethod
 2 {  3。/// <まとめ>  4つの。///  抽象クラス製品 5。/// </要約>  6。パブリックインターフェイス iCoat  7。{  8。ボイド ShowCoat();  9     } 10 }
     
    
     

     
    
        

コンクリート工場の役割コード

 1 namespace FactoryMethod
 2{
 3    /// <summary>
 4    /// 具体工厂类:用于创建商务上衣类
 5    /// </summary>

 6    public class BusinessFactory:IFactory
 7    {        
 8        public ICoat CreateCoat()
 9        {
10            return new BusinessCoat();
11        }

12    }

13
14    /// <summary>
15    /// 具体工厂类,用于创建时尚上衣
16    /// </summary>

17    public class FashionFactory : IFactory
18    {
19        public ICoat CreateCoat()
20        {
21            return new FashionCoat();
22        }

23    }

24}

具体产品角色代码

 1 namespace FactoryMethod
 2{
 3    /// <summary>
 4    /// 具体产品类,商务上衣类
 5    /// </summary>

 6    public class BusinessCoat:ICoat
 7    {
 8        public void ShowCoat()
 9        {
10            Console.WriteLine("这件是商务上衣");
11        }

12    }

13
14    /// <summary>
15    /// 具体产品类,时尚上衣类
16    /// </summary>

17    public class FashionCoat : ICoat
18    {
19        public void ShowCoat()
20        {
21            Console.WriteLine("这件是时尚上衣");
22        }

23    }

24}

25

客户端代码

 1 namespace FactoryMethod
 2{
 3    /// <summary>
 4    /// 客户端代码
 5    /// </summary>

 6    class Client
 7    {
 8        static void Main(string[] args)
 9        {
10            //为了方便以后修改,将工厂类的类名写在应用程序配置文件中
11            string factoryName = ConfigurationManager.AppSettings["FactoryName"];
12          
13            IFactory factory = (IFactory)Assembly.Load("ConcreteFactory").CreateInstance("FactoryMethod." + factoryName);
14            
15            ICoat coat = factory.CreateCoat();
16            //显示你要的上衣
17            coat.ShowCoat();
18        }

19    }

20}

客户端代码需要注意的两个地方:
1,把具体工厂类类名称写在了应用程序配置文件中,方便修改
2,用到了反射,利用.NET提供的反射可以根据类名来创建它的实例,非常方便


由反射想到的:
下面这一段内容不是计划要写的。
如果在具体工厂中,每次new的对象都是一个,而且这些类是继承自抽象产品接口的,那么我们用简单工厂模式也 可以实现动态的增加具体产品类。这样来做,在简单工厂模式中最核心的部分----工厂类不要根据传来的条件去动态创建产品类,利用反射机制去创建。把要实 例化的类名放在应用程序配置文件中,呵呵。。这样利用.NET特有的反射就可以用简单工厂模式解决更多的问题了,工厂方法模式的一部分问题也是可以通过 “这样的简单工厂模式”解决的,在需要增加具体产品类时,不用增加具体工厂,是不是简单一些呀。下去试一下。。。

优点:

  • 基于工厂角色和产品角色的多态性设计是工厂方法模式的关键。它能够使工厂可以自主确定创建何种产品对象。而且如何创建一个具体产品的细节完全封装在具体工厂内部,符合高内聚,低耦合。
  • 在系统中加入新产品时,无需修改抽象工厂和抽象产品提供的接口,无需修改客户端,也无需修改其他的具体工厂和具体产品,很好的利用了封装和委托。

缺点:

  • 在添加新产品时,需要编写新的具体产品类(其实这不算一个缺点,因为这是不可避免的),要增加与之对应的具体工厂类。

应用情景:

  • 类不知道自己要创建哪一个对象时
  • 类用它的子类来指定创建哪个对象
  • 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候  

でファクトリメソッドパターンの彼のアプリケーションのASP.NET HTTPチャンネル、TerryLee エッセイファイル非常によく書かれて、それを見てみることをお勧めします。

参考資料

  • 「素人の言語でのデザインパターン(C#/ Javaバージョン)、」清華大学プレス 
  • MSDN Webキャスト  C#のオブジェクト指向のデザインパターンは、Li Jianzhong先生の話します

ダウンロードソース:
             http://files.cnblogs.com/anlyren/FactoryMethod.rar

:への参照http://www.cnblogs.com/anlyren/archive/2008/01/26/factory_method.html


ます。https://www.cnblogs.com/zhangchenliang/archive/2011/08/17/2143044.htmlで再現

おすすめ

転載: blog.csdn.net/weixin_34403693/article/details/93494972