井,
我有一个关于创建对象的问题(好吧,没有真正的问题,但我想尝试一些新的东西)。实际上我有一些订单,其中包含一个订单项的列表。
这些orderitem被使用并在整个应用程序中传播,我需要一种方法来创建它们。主要的问题是,我希望能够以多种不同的方式创建这些对象。
实际上,我在类构造函数中这样做,并检查给定的参数。(我使用的是php,所以如您所知,该语言没有重载支持:)
一个简单而快速的示例
class foo {
protected $_data=null;
public function __contruct($bar){
if (is_array($bar)){
$this->_data=$bar;
}
else {
$dataFromDb=getDataFromDatabase
$this->_data=$dataFromDb;
}
}
}无论如何,如果我想通过提供另一种类型的参数来创建我的对象,假设一个封装在字符串中的xml文档,我需要将所有这些东西放到我的构造函数中。如果创建对象的过程比较复杂,我最终需要为每个类型创建一个单独的方法,我想初始化。但此方法仅在创建此特殊类型时调用。(我认为您遇到了问题:)
另一个问题出现在我的脑海中,如果我在构造函数中需要更多的参数来创建一个具体的对象,我已经修改了所有的代码,导致构造函数发生了变化。(好的,我可以给他越来越多的参数并使用默认值,但这不是我真正想要的)。
所以我的问题是,哪种模式适合这个问题来解决我创建具体对象的问题。我考虑为我想要创建具体对象的每种方式创建一个工厂。但我不确定这是否是解决此类问题的常见解决方案。
发布于 2010-08-06 05:48:53
如果只是构造函数的签名发生变化,我会这样做(就像Zend Framework通用构造函数一样):
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中缺乏有效的提示。
另一方面,如果你想要特定的构造器,那么我可能会使用工厂,但仍然使用大致相同的方法:
class foo {
public static function create($class, $options)
{
if(class_exists($class))
{
$obj = new $class($options);
}
}
}当然,您也可以使用PHP的反射来确定如何调用构造函数,而不是仅仅注入任意数组参数。
发布于 2010-08-06 06:03:55
您可以简单地将其设置为具有可选参数的工厂:)
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...
}
}https://stackoverflow.com/questions/3419359
复制相似问题