我有3个班级:
Class_A
和Class_B
然后我有一个类,它基本上选择基于某些条件实例化哪个类(A或B)
class Chooser
{
public static function choose($condition)
{
$class = 'Class_' . ucfirst($condition);
return new $class();
}
}
然后我调用静态choose方法,它返回一个右类(A或B)的实例
Chooser::choose($condition);
我的问题:
Chooser::choose($condition);
。如果我这样做,它现在会混乱模式吗?答案 0 :(得分:3)
是的,您的示例适合作为工厂模式。这是创作模式之一。
在原始代码中,根据您的界面进行所有编码。选择器将负责正确选择要实例化的类。通过这样做,您可以实现高度关注。 在这里阅读更多相关信息。 http://www.oodesign.com/factory-pattern.html
答案 1 :(得分:2)
我不会把它称为模式,因为它是具体的代码。模式只是描述可以做什么的方式。它看起来有点像Factory模式的实现,如果你称之为Factory,大多数用户可能会更快地了解它的用途。
然而,它可能更好地描述为参数化对象创建,因为您不验证它生成的类是否实现了特定的接口,这是常见工厂模式的一部分。
确保函数返回具有特定接口的类型。
class Chooser
{
/**
* @return interface
*/
public static function choose($condition)
{
$class = 'Class_' . ucfirst($condition);
if (!is_a($class, 'interface'))
return NULL;
return new $class();
}
}
这需要一些特定的PHP版本,并且由于is_a
而受PHP中的错误影响。有一些方法可以检查特定的类名是否实现了接口。我将此作为练习。
如果条件没有导致对象或者它应该抛出异常,你还需要决定chooser()
函数是否返回NULL
。