2010-12-01 86 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」做內部決定。理想情況下,你的類應該被封裝,使得它們不需要其他的類,除非它們是類本身的成員變量或者爲了功能的目的而被傳入類。