在codeigniter框架中有一个这样的类(我编辑它更清楚,完整的功能在这里http://pastebin.com/K33amh7r):
function &load_class($class, $directory = 'libraries', $prefix = 'CI_')
{
static $_classes = array();
// Does the class exist? If so, we're done...
if (isset($_classes[$class]))
{
return $_classes[$class];
}
is_loaded($class);
$_classes[$class] = new $name();
return $_classes[$class];
}
因此,第一次加载类(传递给此函数)时,它将保存到此静态变量中。下次加载同一个类时,此函数会检查类是否已经存在(如果它已经分配给静态,缓存,我不确定内存是如何存储的),如果存在,则加载( NOT * 实例化 *再次)
据我所知,唯一目的是节省时间或内存而不是两次实例化同一个类。
我的问题是:真正实例化一个类是否会占用内存或消耗加载时间所以它必须像这样缓存?
答案 0 :(得分:4)
CodeIgniter适用于快速原型设计,几乎在任何情况下都不是企业模式的好例子。这种行为与他们对“控制器”对几乎所有其他对象的关系的设计选择有关;即几乎任何东西中只有一个(只有一个控制器实例,每个库只有一个实例,等等)。这种设计选择更适合快速开发(开发人员证明“不必跟踪那么多”或某些此类......)。
基本上,通过不实例化对象(尽可能多地存储对象的实例变量所需的内存)来保存内存,如果对象的构造函数尝试进行相当多的工作,也可以节省时间。
然而,单一实例的适当性显然不是普遍的;有时你真的想要一个新实例。如果你可以证明这一点,那就选择一个更好的框架。
答案 1 :(得分:1)
实例化类中使用的资源和时间通常可以忽略不计。我经常看到使用单例类的主要原因是为了保持数据的完整性。例如,如果您有一个表示数据库中数据的类,则为其创建多个对象可能会导致数据不同步。如果一个对象发生更改并将数据提交给数据库,则其他对象可能具有旧数据。
答案 2 :(得分:0)
它是一个相当简单的概念,利用单例模式确保一个类在应用程序的执行周期中只实例化一次。
这种概念更适用于图书馆。让我们看一个基本的例子:
class Authenticate {
public function login($username, $password) {
....
}
public function logout() {
}
}
现在,通过执行页面,几乎不需要创建上述类的对象,不止一次。要理解的主要是 资源利用
并且 YES ,反复实例化同一个类毫无疑问会在内存中加起来,虽然它可能会像我所示的示例中那样可以忽略不计,但确实会影响。