在php中使用factory模式构建car对象

在php中使用factory模式构建car对象,php,object,factory,factory-pattern,Php,Object,Factory,Factory Pattern,我正在寻找一些帮助,我已经写了一个工厂模式,几乎可以满足我的需要,接受它将返回一个基于参数的新类 我需要的是一个工厂模式,它接收一些东西并返回一个car类型的对象。这辆车将包含诸如类型、型号、年份、品牌和里程表读数等信息 这就是我到目前为止所做的: <?php class Car_Factory_Pattern{ protected $_instance; protected $_dependencies; public function getInstanc

我正在寻找一些帮助,我已经写了一个工厂模式,几乎可以满足我的需要,接受它将返回一个基于参数的新类

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

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

<?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;
    }
}
}

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

$factory = Car_Factory_Pattern()::getInstance();
$factory->registerDependencies(dependencies());
然后让我做:

$some_car = Car_Factory_Pattern()::create('Car_Class');
问题是,我基本上已经硬编码了依赖项,它适用于我正在开发的另一个应用程序,无论如何-我需要这个类做的是获取类型、型号、品牌、年份和奥多姆读数,并返回一个类型为car的对象,不管您传入什么,我可以创建一个包含一系列选项的类,我希望工厂模式能为我做到这一点,除非我弄错了

谢谢你的帮助

$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 );
这是我对工厂的看法。 该类保留每个新类的一个单例,所有的car类都扩展了一个基本car_类,使您能够设置依赖项。 这种方法节省了每次创建新汽车对象的资源 感谢@NiclasLarsson的魔术表演

<?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());

工厂模式的合理使用是允许访问单例对象,但您的工厂总是创建一个新对象!这就是你想要的吗?如果你查看用于工厂模式的数据结构,在params下,你可以传递所有信息的数组。问题是,我希望能够创建多辆车,如果你看到数据结构,从技术上讲,我只能有一辆车…所以我想你不需要工厂,但是只有神奇的方法,或者一个简单的静态类来创建car对象并存储属性,这就是我所想的。我认为你的答案是对的。
<?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());
class Forge_Car{

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


$car = Forge_Car::create('Example_Car', depencies());