0

我正在寻求一些帮助,我已经编写了一个工厂模式,几乎可以满足我的需求,接受它会根据参数返回一个新类。

我需要的是一个工厂模式,它接受一些东西并返回一个汽车类型的对象。这辆车将包含诸如类型、型号、年份、品牌和里程表读数等信息。

这是我到目前为止所做的:

<?php
class Car_Factory_Pattern{

    protected $_instance;

    protected $_dependencies;

    public function getInstance(){
        if(null == self::$_instance){
            self::$_instance == new self();
        }

        return self::$_instance;
    }

    public function create($class){
        if(empty($class)){
            throw new Exception('Cannot declare and empty class.');
        }

        if(!isset(self::$_dependencies)){
            throw new Exception('The $dependencies are not set for this class');
        }

        if(!isset(self::$_dependencies[$class])){
            throw new Exception('This class does not exist in the dependencies array');
        }

        if(isset(self::$_dependencies[$class]['params'])){
            $new_class =  new $class(implode(', ', self::$_dependencies[$class]['params']));
            return $new_class;
        }else{
            $new_class = new $class();
            return $new_class;
        }       
    }

    public function registerDependencies(array $array){
        self::$_dependencies = $array;
    }
}

您需要的数据结构是:

函数依赖(){

$dependencies = array(
    'Car_Class' => array(
        'params' => array(
            'Type',
                            'Model',
                            ...
        ),
    ),          
);

return $dependencies;

}

然后,您通过执行以下操作来实例化该类:

$factory = Car_Factory_Pattern()::getInstance();
$factory->registerDependencies(dependencies());

然后让我这样做:

$some_car = Car_Factory_Pattern()::create('Car_Class');

问题在于我基本上对依赖项进行了硬编码,这适用于我正在处理的另一个应用程序,但是 - 我需要这个类做的是读取类型、模型、品牌、年份和 odom 并给出我返回一个汽车类型的对象,无论您传入什么,我都可以创建一个带有一系列选项的类,我希望工厂模式能为我做到这一点 - 除非我弄错了?

谢谢您的帮助。

4

2 回答 2

0
$new_class =  new $class(implode(', ', self::$_dependencies[$class]['params']));

该代码段将生成如下内容:

$new_class =  new $class('Type,Model,Etc,Etc,will automaticly get more values depending on your array');

那是你真正想要的吗?如果您想将它们作为参数传递,您可以使用ReflectionClass该类。

如果您愿意将所有“参数”作为数组传递,那会更容易:

在“Example_Car”类中,您可以使用以下内容:

class Example_Car {
 private $aVariables = array();

 public function __construct( $aData = array() ) {
  $this->aVariables = $aData;
 }

 public function __get( $sKey ) {
  return isset($this->aVariables[$sKey]) ? $this->aVariables[$sKey] : NULL;
 }
}


$factory = Car_Factory_Pattern()::getInstance();
$factory->registerDependencies(dependencies());

$some_car = Car_Factory_Pattern()::create('Example_Car');

var_dump( $some_car->Type, $some_car->Model );
于 2013-01-18T18:14:42.567 回答
0

这就是我对工厂的想法。该类为每个新类保留一个单例,并且所有汽车类都扩展了一个基础 car_class,它使您能够设置依赖关系。这种方法每次都节省资源来创建一个新的汽车对象感谢@NiclasLarsson 的神奇get

<?php
class Car_Factory_Pattern{

    protected $_instance;

    public static function getInstance($class){
        if(null == self::$_instance){
            self::$_instance[$class] = new $class();
        }
        return self::$_instance[$class];

    }
}

class Base_Car {
 private $aVariables = array();

 public function __construct( ) {
   // to oveload
 }
 public function populate( $aData = array() ) {
  $this->aVariables = $aData;
 }

 public function __get( $sKey ) {
  return isset($this->aVariables[$sKey]) ? $this->aVariables[$sKey] : NULL;
 }
}


class Example_Car extend Base_Car {

 public function __construct( ) {
   // do heavy initialization
 }

  // other functions

}

$car = Car_Factory_Pattern::getInstance('Example_class');
$car->populate(depencies());

添加

使用@NiclasLarsson Example_Car 类

class Forge_Car{

  public static function create($class,$depencies){
    return new $class($depencies);
  }
}


$car = Forge_Car::create('Example_Car', depencies());
于 2013-01-18T18:39:47.890 回答