0

私はこれについての助けを探しています.私は必要なものをほとんど実行するファクトリパターンを書きました.パラメータに基づいて新しいクラスを返すことを受け入れます.

私が必要としているのは、何かを取り込んで 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;
    }
}

これに必要なデータ構造は次のとおりです。

関数の依存関係(){

$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 の読み取りを取り込んで与えることです。タイプ car のオブジェクトを返します。何を渡すかに関係なく、オプションの配列を取るクラスを作成できますが、工場のパターンが私のためにそれを行うことを望んでいました-私が間違っていない限り?

助けてくれてありがとう。

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 を拡張します。このアプローチはリソースを節約して、毎回新しい車のオブジェクトを作成します

<?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 に答える