我有一个DataMapperFactory,我认为我正确地做了它,有一个但我有一个DomainObjectFactory也有意义,但它似乎毫无意义.就是这个:
namespace libs\factories;
use models as Models;
class DomainObjectFactory {
public function build($name) {
$className = 'Models\\' . $name;
return new className();
}
}
我能看到的唯一优势是我保持新运算符不会出现在我的代码中.
DomainObjectFactory必须要比这更多吗?
任何帮助都会非常感谢.
解决方法:
通常,您可以使用工厂从特定实现中抽象出来.如果您使用新的< classname>运算符,每次都实例化一个特定的类.如果要在以后将此类与其他实现交换,则必须手动更改每个新语句.
工厂模式允许您从特定类中抽象.有效的最小用例可能是这样的:
interface UserInterface {
public function getName();
}
class UserImplementationA implements UserInterface {
private $name;
public function getName() { return $this->name; }
}
class UserImplementationB implements UserInterface {
public function getName() { return "Fritz"; }
}
class UserFactory {
public function createUser() {
if (/* some condition */) return new UserImplementationA();
else return new UserImplementationB();
}
}
$f = new UserFactory();
$u = $f->createUser(); // At this point, you don't really have to care
// whether $u is an UserImplementationA or
// UserImplementationB, you can just treat it as
// an instance of UserInterface.
当这变得非常有用时,一个用例(很多)是在进行单元测试时.在测试驱动开发中,您经常使用模拟对象(实现特定接口但实际上没有做任何事情的对象)替换类的依赖关系.使用工厂模式,使用模拟类透明地替换特定类很容易.