2012-03-13 84 views
1

我對PHP很陌生並試圖學習。我有兩個類似的類。我想在傳遞計數和對象類型時創建對象。我讀了一些關於工廠模式。這裏是我的工廠類:瞭解設計模式和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); 

項目和工作是similiar類。我的問題就在這裏,正如我所說,我正在努力學習。我做對了嗎?我瞭解工廠模式嗎?有任何關於這個好文件(我讀了所有關於php.net,還有其他)。

回答

6

在這種情況下,有幾件事似乎是錯誤的。

首先,有哪些是用於創建對象兩個相似的結構:

  • 工廠:如果對象需要某種初始化發佈了「消費」
  • 建設者面前:如果在創建對象之前你必須創建一堆其他物體

通常人們不區分這兩者,只是稱他們爲「工廠」。所以這兩種情況下你會使用一個工廠。

你現在有什麼不符合描述。您正在創建某種數據庫連接,然後獲取一些數據,然後使用它創建對象列表。這不是可重用的代碼。

這將是好得多,如果工廠的用法是這樣的:

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

當然,用它實現這種行爲的工廠類。

此外,你可能想觀看(假定,你尚未看到)關於這個問題的兩個視頻:

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

的' extend'定義了「是」的關係。你必須小心,不要寫'class User extends Table'或者像那樣的精神分裂症。 – 2012-03-13 23:55:34

+1

在閱讀了tereško的回答之後,我意識到我對設計模式不瞭解多少。忽略我的迴應,它不是一個真正的Factory,沒有理由讓Asset類成爲單例。 – augustknight 2012-03-15 15:44:00