2013-12-22 16 views
6

私は異なったデザインパターンを見始めました。そして今、私はファクトリーデザインパターンに焦点を当てています。私はいくつかの例、youtubeのtuturialsとブログを見て、私はほとんどを得たが、私はまだインターフェイスが必要な理由を得るdidnt。工場設計パターン - なぜインターフェイスが必要ですか?

正式な定義は次のとおりです。

は、オブジェクトを作成するためのインターフェイスを定義しますが、サブクラスがインスタンス化するクラスを を決めましょう。ファクトリメソッドは、クラスがサブクラスに対して のインスタンスを延期することを可能にします。

したがって、インターフェイスはファクトリデザインパターンの重要な部分と思われますが、メインメソッドでコレクションを作成するときにその実際的な場所がわかりました。あなたがそれを望んでいなければ、あなたはそれを削除するだけで(それは可能なところで、以下のコードを見てください)、それはまだ計画どおりに動作します。

using System; 
using System.Collections.Generic; 
using System.Collections; 

namespace FactoryDesignPattern 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var FordFiestaFactory = new FordFiestaFactory(); 
      var FordFiesta = FordFiestaFactory.CreateCar("Blue"); 
      Console.WriteLine("Brand: {0} \nModel: {1} \nColor: {2}", FordFiesta.Make, FordFiesta.Model, FordFiesta.Color); 
      Console.WriteLine(); 


      //Inserted this later. Using a collection requires the Interface to be there. 
      List<ICreateCars> Cars = new List<ICreateCars>(); 
      Cars.Add(new FordFiestaFactory()); 
      Cars.Add(new BMWX5Factory()); 

      foreach (var Car in Cars) 
      { 
       var ProductCar = Car.CreateCar("Red"); 
       Console.WriteLine("Brand: {0} \nModel: {1} \nColor: {2}", ProductCar.Make, ProductCar.Model, ProductCar.Color); 
       Console.WriteLine(); 
      } 

      Console.ReadKey(); 
     } 
    } 

    public abstract class Car 
    { 
     public string Make { get; set; } 
     public string Model { get; set; } 
     public string EngineSize { get; set; } 
     public string Color { get; set; } 
    } 

    public class FordFiesta : Car 
    { 
     public FordFiesta() 
     { 
      Make = "Ford"; 
      Model = "Fiesta"; 
      EngineSize = "1.1"; 
     } 
    } 

    public class BMWX5 : Car 
    { 
     public BMWX5() 
     { 
      Make = "BMW"; 
      Model = "X5"; 
      EngineSize = "2.1"; 
     } 
    } 

    public interface ICreateCars 
    { 
     Car CreateCar(string color); 
    } 

    class FordFiestaFactory : ICreateCars 
    { 
     public Car CreateCar(string color) 
     { 
      return new FordFiesta() { Color = color }; 
     } 
    } 

    class BMWX5Factory : ICreateCars 
    { 
     public Car CreateCar(string color) 
     { 
      return new BMWX5(){ Color = color }; 
     } 
    } 
} 

なぜ私はそのインターフェイスが必要ですか?私は複数の抽象的なexplenationsを読んだが、私はそれを得ていないので、私は実用的な答えを好む。

ありがとうございます!

+1

インタフェースは、一般的に、「インタフェース」の文字通りの意味...ない.NETの意味でのインターフェイスを持っています。 –

答えて

7

インターフェイス(または実質的に有効なインターフェイスと同じ抽象的なファクトリベースクラス)は、ファクトリの呼び出し元がファクトリの種類を認識しない場合に便利です。

あなたがあなた自身の実用例えば基盤を提供するので、工場のリストを持ったときにそれがないだけで便利ですなぜ私はここに私の説明を追加します:

は、適切なときに車を作成することになっている方法を想像してみてどのタイプの車を作成するのかを知らずに(工場の実装によって決定される)あなたも作成するために、このような工場を使用することができ、同様に

public Car CreateCarForPerson(Person person, ICreateCars carType) 
{ 
    if (person.OwnsCar) { 
     return carType.CreateCar("red"); 
    } else { 
     return null; 
    } 
} 

:方法はOwnsCarプロパティを持つPersonオブジェクト、見て、そのプロパティは、最終的には、ファクトリメソッドが呼び出されるべきかどうかを決定します

public Car[] CreateAnyNumberOfCars(ICreateCars carType) 
{ 
    var result = new List<Car>(); 
    for (int i = new Random().Next(100); i >= 0; i--) { 
     result.Add(carType.CreateCar("blue")); 
    } 
    return result.ToArray(); 
} 

どのような車種が作成されているかわからないことに注意してください。彼らはインターフェイスを知っているが、正確なタイプを知っていない工場を使用します。

異なるファクトリ実装を提供したい場合は、ファクトリの共通インタフェースを宣言できます。ファクトリが呼び出し元をターゲットコンストラクタの直接呼び出しから遠ざけるようにする場合は、ファクトリインタフェースは必要ありません。

2

いつでも好きなようにデザインパターンを適用できます。インタフェースの削除には何も問題ありません。ただし、インターフェイスを削除すると一般的ではない構造になります。

呼び出しコード(main関数)で構造の詳細を知りたくないため、factory patternを使用します。あなたはFordFiestが何であるか知りたくありません。あなたは一般的に車を作りたいだけです。それがフォード・フィエスタなら、それでは。この詳細は、ファクトリ(およびそのサブクラス)が処理する必要があるものです。右?

コードが特定のファクトリに依存しないようにするには、インターフェイスによって提供される特別な抽象レイヤが必要であり、2つの部分を「デカップリング」します。コードを特定のファクトリ実装にバインドしても構わない場合は、いつでもインタフェースを削除できます。

私は助けました!

0

ファクトリパターンの目的は、作成を抽象化することです。この場合、工場と適切な実現を交換する可能性があります。

抽象化は、.NETのインターフェイスまたは抽象クラスによって実装できます。

public interface ICreateCars 
{ 
    Car CreateCar(string color); 
} 

ビル結果(Carは)ただの状況を見て、クラスまたはインタフェースすることができます。それを構築する方法は工場の仕事です。

2

確かにCarFactoryを使用して派生車クラスを作成することができますが、車の作成をサポートしたいと思う人はCarFactoryから派生しなければなりません。インターフェースの目的は、誰が自動車工場として働くことができるかをより柔軟にすることです。あなたがこの例でCarFactoryであることをする必要があるという考え方はすべてです。ICreateCarsインターフェイスを実装することです。配信されたCarFactory基本クラスのオーバーヘッドを導入する必要はありません。

カーファクトリーを受け入れる関数にパラメータの種類を決定する際の鍵となります。 (またはCarFactoryを保存しているメンバーのメンバータイプ)ICreateCarsを使用すると、車を作成したいと思う人は、そのインターフェイスだけを実装する必要があります。パラメータタイプがCarFactoryの場合は、CarFactoryから継承する必要があります。

2

まあまあではありません - インターフェイスはこのパターンの不可欠な部分ではありません。ファクトリは、静的クラスまたは通常のクラスとしても同様に実装できます。

インターフェイスを使用するのは一般的には非常に良いアイデアであり、コンポーネントベースのデザインではこれを大いに活用しています。 Interface based programmingと呼ばれ、主な利点の1つにIoCコンテナがあり、コードをテスト可能にするということです。私は個人的に、私はそれについて考えず、ほとんど盲目的インターフェイスを使用し

...この文脈で

関連する問題