继承的工厂方法应该返回自己的类的实例而不是继承的类

时间:2010-08-25 20:55:51

标签: php inheritance static factory-pattern

我有一个具有复杂静态工厂方法的类,我们称之为ClassA。我已将ClassA扩展为ClassB,并且我希望ClassB的工厂方法执行ClassA的工厂方法所做的所有操作,除了返回ClassB。

class ClassA{
   static public function Factory($construct_args, $contents){
      $new = new ClassA($construct_args);
      //Does lots of stuff with $contents
   }
}

class ClassB extends ClassA{
   //specialty methods and properties
}

echo get_class(ClassB::Factory($construct_args, $contents);

这应该回应ClassB

有没有办法可以使用ClassA的工厂方法而无需将其复制粘贴到ClassB?我使用的是PHP5,但不是5.3.0。

3 个答案:

答案 0 :(得分:2)

要完全按照您的需要进行Late Static Binding,所以您需要PHP 5.3。它无法在PHP 5.2中完成。人们尝试过。

我见过/用于5.2的解决方法是

  1. 正如您所提到的(并且不想这样做)将工厂方法复制到每个班级

  2. 要求工厂的最终用户提供他们作为参数实例化的类的名称

  3. 要求您的工厂实现接口或让它们从需要定义静态“getClassName”方法的抽象类(或只知道约定)继承,该方法将在工厂中使用。这类似于第一,但有些人更喜欢它,因为它允许他们的工厂方法保持在“底层”类。

答案 1 :(得分:0)

我想这是Late Static Binding的情况。如果你不在5.3,你必须复制它。

但是,您也可以从ClassA中删除工厂方法,并将其设置为专用的Factory或Builder类,该类知道如何创建ClassA和任何特殊类。

答案 2 :(得分:0)

在PHP 5.3中,只需要做(see late static bindings):

static public function Factory($construct_args, $contents){
   $new = new static($construct_args);
   //Does lots of stuff with $contents
   return $new;
}

在PHP 5.2中,您必须更具创造性。类似的东西:

class ClassA {
   static function Factory($construct_args, $contents) {
       return self::privFactory($construct_args, $contents, "ClassA");
   }
   static protected function privFactory($construct_args, $contents, $type){
      $new = new $type($construct_args);
      //Does lots of stuff with $contents
      return $new;
   }
}

class ClassB extends ClassA{
   static function Factory($construct_args, $contents) {
       return self::privFactory($construct_args, $contents, "ClassB");
   }
}