我有一个State类,包括配置以及一些特定于州的方法。我还有一个Factory类,我从中获取了我的MVC类,它也引用了这个State对象。这可以确保我的所有MVC对象都具有特定的状态相关功能。例如,我的State类包括设置和读取缓存或会话的方法。
我的Factory类有许多方法,它们只是包装器,如下所示:
public function myFunction($data){
$this->State->myFunction($data);
}
这个想法是这些方法在Factory中定义,但实际上是由State对象执行的。这允许我打电话:
在编写代码时,$this->myFunction();
而不是包含State的较长的那个。
我不太了解PHP如何在内部工作,但这是否有效?我的思维过程一直是因为我通常只有一个State对象的实例,所以在我的Factory类中使用方法包装器会更好,因为否则这些方法会包含很多大部分时间都没有使用的代码。但我不确定PHP如何在内部工作。
有时我可以有十几个具有父Factory类的对象,并且所有对象都引用相同的State对象。在Factory中定义的包装器方法只调用State的方法,而不是直接处理State是否有效?或者我只是在整个系统中增加额外的开销?
我的想法是,如果Factory只是一个继承的类,并包含许多功能的包装器,那么我可以更有效地简化开发。如果您继承的类具有包装而不是方法中完全定义的代码,它是否会节省内存吗?
答案 0 :(得分:3)
不,这样的包装没有性能优势。实际上,你得到的是一个极小的性能损失。
更重要的是,这种方式隐藏了依赖关系,这可能会使维护代码变得更加困难。
我得到的印象是,你做错了 tm 。以下是我在问题中所写的问题:
State
类负责配置 OR “状态特定方法”吗?
有SRP之类的东西,它指出每个班级都应该承担一个责任。你也可以说,每个班级应该只有一个季节要改变。
为什么你的“MVC类”继承自Factory
类?
在面向对象的代码中,关键字extends
表示类之间的 is-a 关系。拥有class Oak extends Tree
是可以的,但是当你写class User extends Table
时,它就完全疯了......有点侮辱。这由LSP涵盖(有关简化说明:look here)。
您误解了Factory
模式的目的。
工厂是一种创造性的模式。这意味着,工厂的目的是返回对象实例。您应该在每个创建的结构中注入它,而不是继承一些提供State
实例访问权限的方法。
class Factory
{
protected $state = null;
public function __construct( $state )
{
$this->state = $state;
}
public function create( $name )
{
$instance = new $name( $this->state );
return $instance;
}
}
这将带来额外的好处,即Factory
实例创建的所有结构共享相同的State
实例。
好像你正试图让全局状态考虑你的代码库
如果您的应用程序中的每个人都需要访问State
的实例,那么整个架构就会出现严重问题。最终会出现所有图层中都存在单个对象的情况,从而导致抽象中出现严重泄漏。你基本上只是隐藏了一个全局变量。