2012-03-13 8 views
1

私は非常にPHPに慣れていて、勉強しようとしています。私は2つの似たようなクラスがあります。私はカウントとオブジェクトの型を渡すときにそのオブジェクトを作成したいと思います。私は工場のパターンについていくつか読んだ。ここに私のファクトリクラスは次のとおりです。PHPでのパターンとOOPの理解

class AssetFactory 
    { 
     private static $table; 
     public static $objects = array(); 
     public static function Create($asset,$count) 
     { 

      switch ($asset) { 
      case "Item": 
       self::$table = "items"; 
       break; 
      case "Job": 
       self::$table = "jobs"; 
       break; 
      } 
       $db = new Database(); 
       $rows = $db->query("SELECT * FROM ".self::$table." LIMIT ".$count); 

       foreach($rows as $row) 
       { 
        self::$objects[] = new $asset($row); 
       } 

      return self::$objects; 
     } 
    } 

と私が使う5つのアイテム必要があります:私は使用していくつかの仕事を必要とするとき

$myItems = AssetFactory::Create('Item',5); 

を:

$myJobs= AssetFactory::Create('Job',5); 

アイテムやジョブがその似ていますクラス。私は学ぶことを試みていると言ったので、私の質問はここにある。私はこれを正しくやっていますか?私は工場パターンを正しく理解しましたか?これについての良い文書があります(私はphp.netのすべてを読んで、何かを持っています)。

答えて

6

この場合は間違っているようです。

  • 工場:

    まず第一には、オブジェクトの作成に使用される2つの類似した構造がある場合は、オブジェクトを作成する前に:

  • ビルダー「消費」のためにリリースする前に、オブジェクトが初期化のいくつかの並べ替えを必要とする場合あなたは他のオブジェクトの束を作成する必要があります

通常、人々は2つを区別せず、単に "工場"と呼んでいます。したがって、これらは工場を使用する2つのケースになります。

あなたが今持っているものは説明に適合しません。いくつかの種類のデータベース接続を作成してから、いくつかのデータを取得し、それを使ってオブジェクトのリストを作成しています。これは再利用可能なコードではありません。

工場の使用量がこのようなものになるだろうかどうかは非常に良いだろう。もちろん

$connection = new PDO(.. blah..); 
$stmt = $connection->query('SELECT * FROM '.$type.' LIMIT '.$count); 
$factory = new Factory; 
$collection = $factory->buildCollection($type, $stmt->fetchALL(PDO::FETCH_ASSOC)); 

、この動作を実装するファクトリクラスを持ちます。

また、あなたが対象に2つの動画(既に見ていないことを、仮定して)見たいと思うかもしれません:

0

私は工場設計パターンの権威からは遠いですが、私は通常インスタンス化をサブクラスに委譲します。

<?php 
class AssetFactory 
{ 
    public static function Create($asset, $count) 
    { 
     $objects = false; 

     switch (strtolower($asset)) { 
      case 'item': 
      case 'job': 
       $class_name = 'Asset'.$asset; 
       $asset_obj = $class_name::getInstance(); 
       $objects = $asset_obj->Create($count); 
       break; 

      default: 
       // Invalid asset 
       break; 
     } 

     return $objects; 
    } 
} 

class Asset 
{ 
    var $name    = null; 
    var $table    = null; 
    private static $instance = null; 

    private function __construct() {} 

    private function __clone() {} 

    public function Create($count) 
    { 
     $objects = array(); 

     $db = new Database(); 
     $rows = $db->query("SELECT * FROM ".$this->table." LIMIT ".$count); 

     if (is_array($rows)) { 
      foreach($rows as $row) 
      { 
       $objects[] = new Item($row); 
      } 
     } 

     return $objects; 
    } 

    public static function getInstance() 
    { 
     if (empty($self::$instance)) { 
      $class_name = __CLASS__; 
      self::$instance = new $class_name(); 
     } 

     return self::$instance; 
    } 
} 

class AssetItem extends Asset 
{ 
    private function __construct() 
    { 
     $this->name = 'Item'; 
     $this->table = 'item'; 

     parent::__construct(); 
    } 

} 

class AssetJob extends Asset 
{ 
    private function __construct() 
    { 
     $this->name = 'Job'; 
     $this->table = 'job'; 

     parent::__construct(); 
    } 

} 
+0

' 「延長」は「is a」関係を定義する。 'class User extends Table'や何かを統合失調症のように書かないように注意する必要があります。 –

+1

上記のtereškoの反応を読んだ後、私はデザインパターンについてどれだけ知りませんか分かりました。私の反応を無視して、それは本当に工場ではなく、Assetクラスがシングルトンになる理由はありません。 – augustknight