2014-12-13 61 views

回答

4
class C 
{ 
    protected function __construct() 
    { 
    } 

    public static function getObject() 
    { 
     return new self(); 
    } 
} 

UPDATE:

上面的代碼滿足要求:類不能使用new,需要使用工廠方法getObject()創建一個對象被實例化。然而,OP沒有具體說明他們需要這種結構的原因。

這樣的設計出現有幾個原因;其中之一是創建類型爲C的對象需要完成一些初始化,無論出於何種原因,這些初始化都不能在類的構造函數中完成。

構建類C的對象的這種方式的另一個原因是Singleton設計模式;這實際上是一種「反模式」,但這是另一種討論;爲了實現一個Singleton,類C應該是這樣的:

class C  
    { 
     private static $instance = NULL; 

     protected function __construct() 
     { 
     } 

     public static function getObject() 
     { 
      if (! isset(self::$instance)) { 
       self::$instance = new self(); 
      } 
      return self::$instance; 
     } 
    } 

Singleton與否,因爲方法getObject()是靜態的,不能存根或測試框架和原來執行嘲笑必須使用。更多,因爲它是創建類C的對象的唯一方法,所以使用此類的其他類不能孤立地進行測試。

總而言之,即使施工是可能的,也不推薦。使用語言機制強制創建類C的對象使得該類對測試其他使用它的類感到討厭。

如果因爲其複雜的初始化而需要通過某種方法創建類C的對象,則更好的方法是使用設計模式Builder。使其成爲另一類(「構建器」)的非靜態方法,並使用new指示程序員(使用類文檔)不直接創建類C的對象。這樣它不會影響其他類的可測試性。

+0

注意這會在每次調用getObject()時返回一個新的'C'對象,這可能不是所有讀者的預期行爲。 – 2014-12-13 15:22:53

+1

問題中沒有單一限制。它只是說不允許使用'new'創建並強制使用工廠方法。 – axiac 2014-12-13 15:26:01

+0

當然。我會承認魔鬼是在細節中。我關心的是未來的讀者,因爲這個問題雖然看似簡單,但卻是一個滑坡。 – 2014-12-13 15:32:03

3

我想禁用一類由new操作

一種常用方法是私有化的構造函數速溶。

class Example { 
    private function __construct() { 
    } 
} 

以下將導致致命錯誤。

$object = new Example(); 

雖然這會工作,我會鼓勵你,未來的讀者,審查Design Patterns in PHP

+0

您的答案缺少工廠方法。請參閱@ axiac的答案是'getObject' – 2014-12-13 15:23:47

+0

@Paul Sasik,我知道。我的回答故意只涉及問題的第一部分,以鼓勵未來的讀者更多地瞭解這種模式的含義。 – 2014-12-13 15:26:19