0

外部オブジェクトの使用を必要とするいくつかのクラスを設計しようとしています。外部オブジェクトは、サード パーティのライブラリからのものです。疑似コードの例

Class A {
    protected $foo

    public function __construct(\ThirdParty\Foo $foo) {
        $this->foo = $foo
    }
}

これらのサブクラスは、Foo のインスタンス化方法に応じて実装がわずかに異なるメソッドを保持するために作成されます。

Class AA extends A {
    $fooInfo = 'red'
    public function __construct($foo) {
        parent::__construct($foo)
    }
    public function get() {
        return $this->foo->getTypeX();
    }
}

Class AB extends A {
    $fooInfo = 'white'
    public function __construct($foo) {
        parent::__construct($foo)
    }
    public function get() {
        return $this->foo->getTypeY();
    }
}

しかし、サードパーティのアプリを使用するには、インスタンス化するときに $fooInfo の値が必要です。

$clientRed = new Foo('red')
$clientWhite = new Foo('white')

では、AA または AB をインスタンス化するときに、Foo オブジェクトに色情報を取得するにはどうすればよいでしょうか?

$client = new AA(new Foo(????))
4

2 に答える 2

0

ファクトリを使用してオブジェクトをインスタンス化します。

そのようです:

class ClientFactory {
    public function getClient($objectType){
        switch(objectType) {
           case 'AA':
              $fooInfo = 'red';
              break;
           case 'AB':
              $fooInfo = 'white';
              break;
        }
        $foo = new Foo($fooInfo);
        return new $objectType($foo);
    }
}

Fooクライアントは、作成されたクラスについて何も知る必要がなくなりました。持っていることを知っているだけです。また、クラスの要件が変更された場合 (AB には 'red' Foo も必要になります)、1 つの場所で変更できます。

于 2013-06-05T16:14:08.300 に答える