这是一种模式,或类似于模式,以及它的名称

时间:2011-12-21 11:51:05

标签: php design-patterns

我有3个班级:

  • 定义一些方法的接口类
  • 实现该接口Class_AClass_B
  • 的2个类

然后我有一个类,它基本上选择基于某些条件实例化哪个类(A或B)

class Chooser
{
   public static function choose($condition)
   {
      $class = 'Class_' . ucfirst($condition);  
      return new $class();
   }
}

然后我调用静态choose方法,它返回一个右类(A或B)的实例

Chooser::choose($condition);

我的问题:

  • 首先,这是一个有效的模式(或接近模式),它的名称是什么
  • 如果它接近某个模式,我该如何修改呢?这是一个合适的模式
  • 第三,Chooser类非常简单。我可以在原始代码中使用该逻辑而不是Chooser::choose($condition);。如果我这样做,它现在会混乱模式吗?

2 个答案:

答案 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