我想禁用一個類被new
運算符實例化,但讓我們假設一個創建並返回實例的類的getObject
方法。它可行嗎?阻止類實例化standalone,從工廠啓用
回答
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
的對象。這樣它不會影響其他類的可測試性。
我想禁用一類由
new
操作
一種常用方法是私有化的構造函數速溶。
class Example {
private function __construct() {
}
}
以下將導致致命錯誤。
$object = new Example();
雖然這會工作,我會鼓勵你,未來的讀者,審查Design Patterns in PHP。
您的答案缺少工廠方法。請參閱@ axiac的答案是'getObject' – 2014-12-13 15:23:47
@Paul Sasik,我知道。我的回答故意只涉及問題的第一部分,以鼓勵未來的讀者更多地瞭解這種模式的含義。 – 2014-12-13 15:26:19
- 1. 阻止類被實例化
- 2. 通用工廠類實例化
- 3. Rails STI - 阻止基類實例化
- 4. 防止直接實例化的工廠類
- 5. 使用工廠類來實例化相關具體類的組
- 6. PHP阻止父類從多個孩子實例化?
- 7. React類實例prop阻止使用PureComponent
- 8. 什麼類的類實例化工廠類?
- 9. 使用參數在單件工廠中實例化類
- 10. 實例化工廠參數角度
- 11. Android:從Android反射實例化JNDI工廠強制使用javax
- 12. 如何防止在定義的「工廠類」中實例化的對象?
- 13. 我可以阻止實例化非模板類嗎?
- 14. Python抽象類 - 如何阻止實例化?
- 15. 從類內實例化類
- 16. 實例化類不工作
- 17. 防止其他類的類實例化
- 18. 如何使用工廠實例化通用對象
- 19. C#阻止AppDomain程序集的類實例從文件訪問
- 20. C#阻止類從序列化
- 21. 阻止訪問派生類除了經由工廠
- 22. 如何在Ruby中專門化只能通過工廠實例化的類?
- 23. 工廠方法創建單例實例
- 24. 直接調用AngularJS上工廠實例化的對象
- 25. 如何使用工廠方法在XAML中實例化對象
- 26. 使用Spring容器實例化域對象和工廠對象
- 27. 在Spring MVC中使用工廠模式實例化bean 3
- 28. 如何使用Storyboard與工廠模式View Controller實例化?
- 29. 從名稱實例化類?
- 30. 從JNI實例化Java類
注意這會在每次調用getObject()時返回一個新的'C'對象,這可能不是所有讀者的預期行爲。 – 2014-12-13 15:22:53
問題中沒有單一限制。它只是說不允許使用'new'創建並強制使用工廠方法。 – axiac 2014-12-13 15:26:01
當然。我會承認魔鬼是在細節中。我關心的是未來的讀者,因爲這個問題雖然看似簡單,但卻是一個滑坡。 – 2014-12-13 15:32:03