2012-02-17 16 views
2

工場は一般的なシングルトンですか?あるいは、FactoryパターンがSingletonになることはありますか? のは、我々は次のようFactoryパターンのクラスを持っていると仮定しましょう:工場パターンは一般的なシングルトンですか?

abstract class Factory { 

    /* This cache contains objects that has already been called. 
    ** It stores the class name, arguments and the object itself. 
    ** If an another call for the same class with the same arguments 
    ** is made we return the object. 
    */ 
    private static $cache; 

    public static function __callStatic($class, $args) { 
     // 1) we check if the class already exists in the cache 

      // 2) if it does then we return the object in the cache 

      // 3.1) otherwise we create a new object 
      // 3.2) we pass to the constructor of that object the arguments with ReflectionClass 
      // 3.3) we store the class name, arguments and object in the cache 
    } 

} 

を、コンクリートクラス

class My extends Factory {} 

そして、我々はコンストラクタの引数を受け入れるクラスDontKnow($arg1, $arg2)$arg1$arg2を持っていると仮定しましょう。コンストラクタへのパラメータを受け入れない別のクラスDoNot()があるとしましょう。我々は

My::DontKnow('sample', 3); 

を呼び出すとき

は、今、私たちは今、私たちのファクトリクラスのキャッシュ内に格納されているオブジェクトを返します。 もう一度呼び出すと、ファクトリクラスは新しいオブジェクトのインスタンスを作成せず、同じオブジェクトを再度使用します。

たとえば、My::DontKnow('sample', 3)->setSomething('key', 'myvalue');と設定し、別のスコープの中にMy::DontKnow('sample', 3)->getSomething('key');と入力すると、myvalueと表示されます。

しかし、私たちは工場出荷時のクラスは、私たちのファクトリクラスMyが静的​​であることから、そのクラスDONOT(の「シングルトン」オブジェクト)を返しますMy::DoNot()を呼び出す場合、静的スコープを持っていると、それから、どこでも呼び出すことができます。

これはシングルトンの別の例ではありませんか?これはシングルトンパターンと同様に避けるべきでしょうか?

+1

A工場では必ずしもない、あるいは一般的に、それが作成するオブジェクトをキャッシュ、また工場は通常、静的にコールされます。あなたが書いているのは、工場ではなく、レジストリまたはシングルトンです。 – deceze

+0

@decezeですが、これは工場クラスです。静的にオブジェクトを生成します。それは本当です、それをする必要はありません。しかし、それは起こり得る。これはシングルトンではありません。静的であることを除けば、Singletonsとは何の関係もありません。 – Shoe

+2

ちょうどあなたが*コール*するので、 'ファクト'はそれが1であることを意味しません。 :)単純な工場だけではなく、静的なSingleton Registry Factoryのサービスロケータがあります。 – deceze

答えて

4

いいえ、そうではありません。あなたが何を記述しているのかは、工場パターンの特殊なユースケースか、まったく工場ではないでしょう。単純なファクトリは 'インスタンス管理'を行わず、必要な具象サブクラスの新しいインスタンスを返します。

ファクトリメソッド自体が静的であるという事実は、返されたサブクラスのメソッドがあることを意味しません。ファクトリは名前のとおり、非静的な機能を持つ具体的なオブジェクトを生成します。

http://sourcemaking.com/design_patterns/factory_method

+0

+1彼は言った。 – kingmaple

+0

これは避けるべきですか、それとも使用できますか? – Shoe

+0

この静的Singleton Registry Factoryサービスロケータはあなたのものですか?私は知らない、それは...あなたがそれを避けることができるなら、あなたはむしろそうすべきだと思います。単体テストをより難しくしていますか?はい。 – markus

関連する問題