首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >工厂模式合适吗?

工厂模式合适吗?
EN

Stack Overflow用户
提问于 2010-08-06 05:34:04
回答 2查看 161关注 0票数 1

井,

我有一个关于创建对象的问题(好吧,没有真正的问题,但我想尝试一些新的东西)。实际上我有一些订单,其中包含一个订单项的列表。

这些orderitem被使用并在整个应用程序中传播,我需要一种方法来创建它们。主要的问题是,我希望能够以多种不同的方式创建这些对象。

实际上,我在类构造函数中这样做,并检查给定的参数。(我使用的是php,所以如您所知,该语言没有重载支持:)

一个简单而快速的示例

代码语言:javascript
复制
class foo {
    protected $_data=null;
    public function __contruct($bar){
        if (is_array($bar)){
            $this->_data=$bar;
        }
        else {
            $dataFromDb=getDataFromDatabase
            $this->_data=$dataFromDb;
        }
    }
}

无论如何,如果我想通过提供另一种类型的参数来创建我的对象,假设一个封装在字符串中的xml文档,我需要将所有这些东西放到我的构造函数中。如果创建对象的过程比较复杂,我最终需要为每个类型创建一个单独的方法,我想初始化。但此方法仅在创建此特殊类型时调用。(我认为您遇到了问题:)

另一个问题出现在我的脑海中,如果我在构造函数中需要更多的参数来创建一个具体的对象,我已经修改了所有的代码,导致构造函数发生了变化。(好的,我可以给他越来越多的参数并使用默认值,但这不是我真正想要的)。

所以我的问题是,哪种模式适合这个问题来解决我创建具体对象的问题。我考虑为我想要创建具体对象的每种方式创建一个工厂。但我不确定这是否是解决此类问题的常见解决方案。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-08-06 05:48:53

如果只是构造函数的签名发生变化,我会这样做(就像Zend Framework通用构造函数一样):

代码语言:javascript
复制
class foo {
  // params

  public function __construct($options = null)
  {

    if(null !== $options)
    {
       $this->setOptions($options);
    }
  }

  public function setOptions(array $options){

    foreach ($options as $name => $value){
      $method = 'set' . $name;
      if(method_exists($this, $method)
      {
         $this->$method($value);
      }
   }

   return $this;
  }
}

这本质上意味着所有的构造函数参数都是具有命名键的数组元素,在初始化期间,您想要在此数组中使用的任何东西都需要创建一个setter,然后自动调用它。缺点是在IDE中缺乏有效的提示。

另一方面,如果你想要特定的构造器,那么我可能会使用工厂,但仍然使用大致相同的方法:

代码语言:javascript
复制
class foo {

  public static function create($class, $options)
  {
     if(class_exists($class))
     {
        $obj = new $class($options);
     }
  }
}

当然,您也可以使用PHP的反射来确定如何调用构造函数,而不是仅仅注入任意数组参数。

票数 2
EN

Stack Overflow用户

发布于 2010-08-06 06:03:55

您可以简单地将其设置为具有可选参数的工厂:)

代码语言:javascript
复制
class Example_Factory
{
    public static function factory($mandatoryParam, $optionalParam = null)
    {
        $instance = new self;
        $instance->setMandatory($mandatoryParam);

        if ($optionalParam !== null) {

            $instance->setOptional($optionalParam);
        }

        return $instance;
    }

    public function setMandatory($in)
    {
        // do something....
    }

    public function setOptional($in)
    {
        // do some more...
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3419359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档