she*_*iel 5 php factory base-class
在我们MVC系统中所有模型的基类中,我创建了一个工厂方法BaseCLass :: getNew(),它通过SomeChildClass :: getNew()调用时返回所请求子类的实例.
现在,我正在寻找一种方法来强制程序员使用这个工厂.也就是说,我喜欢任何直接创建的类,如下所示:
new SomeChildClass
Run Code Online (Sandbox Code Playgroud)
将在创建时抛出异常,并且只有工厂创建的类才可用.
任何想法如何实现?
我们的代码是用PHP编写的,但即使您考虑使用其他语言,您的想法很有可能也很有价值.
编辑:我不能使我的构造函数私有,因为我继承的类中的框架构造函数是公共的,而且php不允许我这样做.
通过使类具有私有构造函数。
class Base {
private static $constructorToken = null;
protected static function getConstructorToken() {
if (self::$constructorToken === null) {
self::$constructorToken = new stdClass;
}
return self::$constructorToken;
}
}
class Derived extends Base {
public function __construct($token) {
if ($token !== parent::getConstructorToken()) {
die ("Attempted to construct manually");
}
}
public static function makeMeOne() {
return new Derived(parent::getConstructorToken());
}
}
Run Code Online (Sandbox Code Playgroud)
该解决方案利用对象相等规则,stdClass在基类上存储只有派生类可以访问的“神奇密码”对象。你可以根据口味调整它。
我不会说它像这个想法一样可怕debug_backtrace,但我仍然觉得事情应该采取不同的方式。
| 归档时间: |
|
| 查看次数: |
478 次 |
| 最近记录: |