0

重複の可能性:.NETFramework
のコンストラクターとファクトリ

私はファクトリーパッテンを理解し、それを実装しましたが、それがもたらす利益を得ることができませんでした。たとえば、次の代わりに:

MyType1 obj=new Mytype1();
MyType2 obj=new Mytype2();

書き込み:

IMyType obj1 = Factory.Create(1);
IMyType obj2 = Factory.Create(2);

それは私が見逃したものなのか、それとも思いつかないものなのか。あなた自身の経験例を挙げていただけませんか。

4

4 に答える 4

3

ファクトリパターンのいくつかの利点:

  1. 作成したオブジェクトを追跡できます。オブジェクトを再利用したり、作成されるオブジェクトの数に制限を適用したりする場合は、ファクトリがそれを適用できます。
  2. オブジェクトの作成方法を制御できます。オブジェクトの作成に使用されるパラメータがある場合、クライアントがすでに作成されているオブジェクトに同じパラメータを渡すと、既存のオブジェクトを返すことができます。
  3. ファクトリにインターフェイスを返すようにすることができますが、インターフェイスをサポートするさまざまなタイプのオブジェクトを内部的に作成します。
于 2012-08-09T00:47:39.023 に答える
1

ファクトリパターンは多くの理由で優れています

それらのいくつかは次のとおりです。

  • 工場でアイテムを初期化し(デフォルト値など)、アイテムの作成を手続き型にすることができます(他のクラス/手順を調べ、デフォルトを取得し、構成値を検査します)。

コンストラクターはアイテムを作成する1つの方法ですが、クラスをこれらの依存関係に緊密に結合しない限り、他のクラスを検査したり、新しく作成されたインスタンスの外部にある他のプロセスを実行したりすることはできません。

  • それはあなたのチームの開発者の間でパターン/実践を実施するアイテム作成のための中央リポジトリを提供します

それらは私が考えることができる理由のいくつかです:)

例えば

このクラスは、インスタンス化のためにConfigManagerに依存しています

class SomeClass 
{
    public int SomeValue;

    public SomeClass() 
    {
        // Check the config for some value
        SomeValue = ConfigManager.GetDefaultInt("SomeValue");
    }
}

このクラスは、ファクトリを使用しているためではありません

class SomeClass 
{
    public int SomeValue;

    public SomeClass() 
    {
    }
}

class SomeClassFactory 
{
    public SomeClass CreateSomeClass() 
    {
        SomeClass obj = new SomeClass();
        obj.SomeValue = ConfigManager.GetDefaultInt("SomeValue");
    }
}
于 2012-08-09T00:40:05.910 に答える
1

ファクトリパターンの利点は、使用方法から構造と特定のタイプの詳細をカプセル化することです。これにより、変更を加える場所を減らして、後でより興味深いデザインに進化させることができます。

この例を考えてみましょう。

public interface IStorage
{
    void Save(SomeObject toSave);
    SomeObject Get(SomeId id);
}

public class DatabaseStorage : IStorage
{
    public void Save(SomeObject toSave)
    {
       //persist to DB somehow
    }

    public SomeObject Get(SomeId id)
    {
       //get from db somehow and return
    }
}

public class StorageFactory
{
    public IStorage GetStorage()
    {
         return new DatabaseStorage();
    }
}

public class DatabaseStorage : IStorage
{
    public void Save(SomeObject toSave)
    {
       //persist to DB somehow
    }

    public SomeObject Get(SomeId id)
    {
       //get from db somehow and return
    }
}

ここで、後でいくつかの結果をキャッシュするか、すべての結果をログに記録する必要があると想像してください。次のようなプロキシを作成できます。

public class LoggingStorage : IStorage
{
    private readonly IStorage _proxied;

    public LoggingStorage(IStorage proxied)
    {
        _proxied = proxied;
    }

    public void Save(SomeObject toSave)
    {
       //log this call
       _proxied.Save(toSave);
    }

    public SomeObject Get(SomeId id)
    {
       //log this call
       return _proxied.Get(id);
    }
}

さて、コンストラクターを使用した場合、これでラップするには、コンストラクターを使用するたびに置き換える必要があります。工場を使用した場合は、変更するだけです。

public class StorageFactory
{
    public IStorage GetStorage()
    {
         return new LoggingStorage(new DatabaseStorage());
    }
}

もちろん、投機的なファクトリはこれに対して少し手間がかかるように見えることがあります。そのため、コンストラクターをカプセル化することを好みます。

于 2012-08-09T01:01:41.820 に答える
1

jQueryは、JavaScriptの動作を利用して、メモリフットプリントが非常に小さいオブジェクトを作成するファクトリ関数です。

ひどく切断され、大幅に簡略化されたバージョンのjQueryを使用して調査し、潜在的な利点を確認してみましょう。

var $ = jQuery = (function(){ //this anon function fires once, and returns a function

//defines all kinds of internal functions jquery uses here

function jQuery(selector,context){ // we're going to return this inner JQ later
    //defines only the logic needed to decide what to do with the arguments here
    //and then builds the jQuery object with 'return new jQuery.prototype.init();'
}

//defines jQuery.prototype properties here:
jQuery.prototype = {
    //...
    init:function(selector,context){ //gets used to build the JQ objects
        this.constructor.prototype = jQuery.prototype; //hands off the function prototype
    }
    //...
}

return jQuery; //this gets assigned to the outer jQuery and $ vars

})()

これで、プロトタイプを拡張できる名前空間のようなファクトリ関数ができました。これらのメソッドは、吐き出されるオブジェクトで使用できると期待しています。さらに、すべての関数はクロージャから引き出された参照、または参照として渡される外部のプロトタイプオブジェクトであるため、オブジェクト自体は、通常ラップするDOMオブジェクトを除いて、メモリ内でほとんど重みがありません。少しのロジックといくつかの状態変数を除いて、ファクトリ関数のプロトタイププロパティに新しいメソッドを追加するときに、jQueryが最初に解析されるか、プロトタイプオブジェクトから渡されるときに、オブジェクトに必要なすべてが構築されます。

今、それをやってみてくださいnew jQuery()

どちらかといえば、JavaScriptでファクトリパターンを適用することは、非常に強力です。

于 2012-08-09T01:36:26.863 に答える