0

オブジェクトが別の特定のオブジェクトを介してのみインスタンス化されるようにするにはどうすればよいですか?

たとえば、マッパーを格納するためのレジストリオブジェクトがあるとします。クライアントコードがget()レジストリのメソッドを呼び出すと、要求されたマッパーを遅延ロードして返します。newクライアントコードが演算子を使用してマッパーの複製インスタンスを作成するのを止めるものがないことを除いて、それは問題ありません。

私が考えることができる唯一のオプションは、私のマッパーがパラメーターとしてレジストリオブジェクトを必要とすることです。他に選択肢はありますか?

職業はなんですか?この種の重複を防ぐことについても気にする必要がありますか?

4

3 に答える 3

1

おそらく、人々が自分でインスタンスを作成するのを妨げようとするべきではありませんか? インスタンス化すべきでない場所でオブジェクトをインスタンス化しないように、自分自身や同僚が信頼していない場合は、問題が発生します。

マッパーが機能するためにレジストリを必要としない場合は、コンストラクターを介してそれをオブジェクト化しないでください。静的メソッドに渡すのはかなり奇妙に思えますが、静的を使用しているため、コードの柔軟性が低下します。そして、これらのテストでは必要のないレジストリを介してマッパーを適切にインスタンス化するためのハックを作成せずに、マッパーの単体テストを行うにはどうすればよいでしょうか? ここでの良い投稿: http://kore-nordmann.de/blog/0103_static_considered_harmful.html

于 2012-12-11T08:23:22.317 に答える
0

newオペレーターから保護することはできません。ただしget()、クラスにクラス/オブジェクトをシングルトンにするためのメソッドがある(またはレジストリを使用する)ことができます。

class clTest {
 private static $oInstance;

 public static function get() {
  if( !self::$oInstance ) {
   self::$oInstance = new clText;
  }

  return self::$oInstance;
 }
}
于 2012-12-11T07:19:44.233 に答える
0

外部インスタンス化を防ぎたい場合は、__construct をプライベートとして宣言し、静的メソッドへの呼び出しを使用して Mapper クラスのインスタンスを取得するだけです。次に、レジストリ クラスのインスタンスを渡し、パラメーターがレジストリ クラスのインスタンスである場合にのみ、新しいインスタンスを返すことができます。

class Mapper{
  private __construct(){}

  public static function getInstance($registry){
    if($registry instanceof Registry){
      return new Mapper();
    }
  }
}

$registry = new Registry();
$mapper = Mapper::getInstance($registry);
于 2012-12-11T07:23:53.977 に答える