工場は一般的なシングルトンですか?あるいは、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()
を呼び出す場合、静的スコープを持っていると、それから、どこでも呼び出すことができます。
これはシングルトンの別の例ではありませんか?これはシングルトンパターンと同様に避けるべきでしょうか?
A工場では必ずしもない、あるいは一般的に、それが作成するオブジェクトをキャッシュ、また工場は通常、静的にコールされます。あなたが書いているのは、工場ではなく、レジストリまたはシングルトンです。 – deceze
@decezeですが、これは工場クラスです。静的にオブジェクトを生成します。それは本当です、それをする必要はありません。しかし、それは起こり得る。これはシングルトンではありません。静的であることを除けば、Singletonsとは何の関係もありません。 – Shoe
ちょうどあなたが*コール*するので、 'ファクト'はそれが1であることを意味しません。 :)単純な工場だけではなく、静的なSingleton Registry Factoryのサービスロケータがあります。 – deceze