2010-12-01 87 views
0

对不起,我不能提出一个更具描述性的标题。我的问题是以下。假设您有两个类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以无缝方式返回的对象类型的选择?

回答

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”做内部决定。理想情况下,你的类应该被封装,使得它们不需要其他的类,除非它们是类本身的成员变量或者为了功能的目的而被传入类。