我正在尝试设计一些需要使用外部对象的类。外部对象来自第三方库。 psudocode中的示例
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(????))
答案 0 :(得分:1)
class AA extends A {
const fooInfo = 'red'
...
$client = new AA(new Foo(AA::fooInfo))
您也可以创建工厂:
function CreateClient ($clientType) {
return new $clientType(new Foo($clientType::fooInfo))
}
$client = CreateClient('AA')
答案 1 :(得分: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现在也需要'红色'Foo),您可以在一个位置进行更改。