PHP对象创建,工厂方法和依赖注入

时间:2012-11-13 01:25:31

标签: php dependency-injection factory-method

我期待一个很好的模式来创建绑定到数据库的对象。我将用一个简单的例子来说明我的想法:创建用户。

首先:创建/加载用户的工厂方法。用户配置在新创建的实例中完成。

$user = User::Create($db); // Flag the instance to create an user when save() is called
$user->setUsername('...'); 
$user->set...; 
$user->save(); // Will insert a new user into the database.

...
$user = User::Load($db, id); // Load an user from the database. Flag object to update.
$user->setUsername('...'); // Change username.
$user->save(); // Update existing object instead of inserting a new one.

第二种:立即创建新用户的工厂方法。

User::Create($db, $username, $password, ...); // Create and insert a new user.
...
$user = User::Load($db, 1);
$user->setUsername("..."); // Change username.
$user->save(); // Save only updates a user, no flag needed because an user is entirelly created by User::Create().

第三步:使用具有静态工厂方法的工厂类。

Factory::newUser($db, $username, $password, ...); // May contain many other types of objects.

我可以做到这样的事情:

$factory = new Factory($db);
$user = $factory->newUser($username, $password, ...);

另一件事是,我应该创建一个单例来提供数据库的句柄,该数据库将在应用程序上用于创建对象(不对对象内部的句柄进行硬编码)吗?

示例:

class DB {
    public static function handle() { /* Do a lazy connection to a database once. */ }
}

...
$user = User::Create(DB::handle(), ...);

所以,我真正的问题是,什么是最好的模式?我知道这可能太相对了,但我需要一些提示,当然,我想将依赖关系留在外面,而不是在对象内部硬编码。

提前致谢。

1 个答案:

答案 0 :(得分:0)

如果您的问题来自“模型层”,您应该查找数据库模式,例如: