单例模式和注册表模式对我来说非常简单易懂,但工厂模式一直是我无法让我的大脑 100% 解释的东西。我想我现在可能明白了,我在下面写了一个示例代码,请检查并告诉我这是否是工厂模式的正确使用。示例在 PHP...
<?php
/**
* Factory.class.php
*/
class Factory {
public static $_database;
public static $_cache;
public static $_session;
// Build our User object with all it's dependencies
public static function makeUserObject()
{
$user = new User();
$user->setDatabaseObject(self::$_database);
$user->setCacheObject(self::$_cache);
$user->setSessionObject(self::$_session);
return $user;
}
// other objects will be here someday......
}
/**
* User.class.php
*/
class User
{
public function __construct() { }
// inject Database Object
public function setDatabaseObject($databaseConnectionObject)
{
$this->_databaseObject = $databaseConnectionObject;
}
// inject Cache Object
public function setCacheObject($cacheObject)
{
$this->_cacheObject = $cacheObject;
}
// inject Session Object
public function setSessionObject($sessionObject)
{
$this->_sessionObject = $sessionObject;
}
// other methods here for User object...........
}
/**
* index.php Main page that puts it all together
* assume that classes are autoloaded into this page already
*/
// Set our Database + Cache + Session objects into the Factory Object
Factory::$_database = new Databse();
Factory::$_cache = new Cache();
Factory::$_session = new Session();
// Create our User object
// The factory class will build the User object and inject all
// it's dependencies for us =)
$user = Factory::makeUserObject();
?>
所以基本上创建了数据库、缓存和会话对象(此处未显示),然后将它们添加到工厂对象中,我可以在工厂类中为每个需要这 3 个依赖项中的任何一个的对象构建一个方法,我可以设置他们也得到哪些。这也使得单个类仍然可以在某种程度上具有可移植性,因为如果我想在没有工厂对象的情况下直接注入依赖项的话。这听起来对吗?如果这是正确的,这听起来真的很有用
更新#1
这是基于我在此处阅读的博客文章http://www.potstuck.com/2009/01/08/php-dependency-injection/他们将其称为“工厂”,我一直在使用注册表和很多人一直告诉我要研究一个“工厂”,而我读到的所有关于它的内容都没有在我的脑海中点击,直到我读到这篇文章但看起来它不是一个“工厂”?
更新 #2
来自维基百科 http://en.wikipedia.org/wiki/Factory_object
在面向对象的计算机编程中,工厂对象是用于创建其他对象的对象。它是构造函数的抽象,可用于实现各种分配方案,例如单例模式。工厂对象通常为它能够创建的每一种对象都有一个方法。这些方法可选地接受定义如何创建对象的参数,然后返回创建的对象。工厂对象用于获取特定类型的对象是一个比简单地创建新对象更复杂的过程的情况。工厂对象可能决定动态地创建对象的类(如果适用)、从对象池中返回它、对对象进行复杂的配置或其他事情。
所以也许这毕竟是一个“工厂对象”......