让一个对象决定它的类

时间:2010-12-01 00:18:24

标签: php design-patterns instantiation

对不起,我无法想出一个更具描述性的标题。我的问题如下。假设您有两个类A和B,并且您知道有时可能会发生一些代码尝试实例化类型A的对象,而实际需要的是类型B的对象。重点是代码到决定哪一个是正确的对象自然属于A类而不是客户代码。

在javascript中(好吧,js没有类,但是说得清楚)你可以简单地做一下

function A() {
    if(some_condition) {
        return new B();
    }
    //else we proceed to customize and return our object
}

我想在PHP中做类似的事情。我能想到的最好的事情是

class A {
    private function __construct() {
        //whatever you need to do
    }

    public static function getInstance() {
        if(some_condition) {
            return new B();
        }
        else {
            return new A();
        }
    }
}

问题是客户端代码总是必须知道A是特殊的,你必须使用静态方法实例化对象。

有没有办法委托给A选择要以无缝方式返回的对象类型?

1 个答案:

答案 0 :(得分:0)

不幸的是,不,我认为你能做的最好是:

class Decider {

    public static function decide() {
        if(some_condition) {
            return "A";
        }
        else {
            return "B";
        }
    }
}

$new_class = Decider::decide();

$new_object = $new_class();

然而,这与你走近它的方式真的没什么不同。我不会认为这是一个无效的设计模式,但是我会把它留给外部类来做决定而不是让类“A”或类“B”做出决定。理想情况下,您的类应该以不需要其他类的方式封装,除非它们是类本身的成员变量或者为了功能目的而传递给类。