在php中使用factory模式构建car对象
我正在寻找一些帮助,我已经写了一个工厂模式,几乎可以满足我的需要,接受它将返回一个基于参数的新类 我需要的是一个工厂模式,它接收一些东西并返回一个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
<?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());