2011-12-28 47 views
1

這是實現工廠方法的最佳途徑的最好辦法。這是實現工廠方法

1)包含該模型的所有成員工廠方法來定義

class UserFactory { 
    /** 
    * @return UserModel 
    */ 
    function create($firstName, $lastName, $age) { 
     $user = new UserModel(); 
     $user->setFirstName($firstName); 
     $user->setLastName($firstName); 
     $user->setAge($age); 
     return $user; 
    } 
} 

// Usage example 
$user = $userFactory->createUser('Yanik', 'Lupien', 99); 
$userRepo->persist($user); 

2)簡單地創建模型並返回它的工廠方法。我們可以通過使用模型設置器來填充模型。

class UserFactory { 
    /** 
    * @return UserModel 
    */ 
    function create() { 
     $user = new UserModel(); 
     return $user; 
    } 
} 

// Usage example 
$user = $userFactory->create(); 
$user->setFirstName('Yanik'); 
$user->setLastName('Lupien'); 
$user->setAge(99); 

$userRepo->persist($user); 

3)上設置了一個param

class MyUserFactory { 

    const ADMIN = 'admin'; 
    const SUPER_ADMIN = 'superadmin'; 

    public function create($type = self::ADMIN) 
    { 
    switch ($type) { 
    case self::SUPER_ADMIN: 
     return new UserSuperAdmin($options); 
     break; 

    case self::ADMIN: 
    default: 
     return new UserAdmin($options); 
     break; 
    } 
} 

// Usage 
$user = $myUserFactory->create(MyUserFactory::SUPER_ADMIN); 

if ($user instanceof UserSuperAdmin) { 
    $user->setSuperAdminProperties(); 
} 

if ($user instanceof UserAdmin) { 
    $user->setAdminProperties(); 
} 
+0

第二種方式具有更少的代碼,並且是更好的。爲什麼要創建多種方式來設置名字? – 2011-12-28 22:46:30

+0

根據@ mmmshuddup的回答,我不認爲這實際上是工廠模式。 – McKay 2011-12-28 22:59:00

+0

http://en.wikipedia。org/wiki/Factory_method_pattern – McKay 2011-12-28 22:59:23

回答

3

我始終認爲,應用的工廠模式的方法是,當有多種類型的,說返回不同的類實現基地工廠,用戶。例如,管理超級管理員。你可以有像這樣一個工廠方法:

// within a class named "User" for example 
const ADMIN = 'admin'; 
const SUPER_ADMIN = 'superadmin'; 

// ... 

public static function factory($type = 'admin') 
{ 
    switch ($type) { 
     case self::SUPER_ADMIN: 
      return new UserSuperAdmin(); 
      break; 

     case self::ADMIN: 
     default: 
      return new UserAdmin(); 
      break; 
    } 
} 

兩個 - 或任何爲此事 - 的用戶類將implement某種接口定義這些getter和你使用像setFirstName()setAge()例如setter方法。

你也可以定義一個$options陣列或東西一起傳遞給他們的每一個構造函數來實例化所有這些領域的馬上給你。

public static function factory($type = 'admin', $options = array()) 
{ 
    switch ($type) { 
     case self::SUPER_ADMIN: 
      return new UserSuperAdmin($options); 
      break; 

     case self::ADMIN: 
     default: 
      return new UserAdmin($options); 
      break; 
    } 
} 

然後,這裏是contructors的一個示例:

class UserAdmin implements IUserInterface // for example 
{ 
    public function __construct($options) 
    { 
     // do something with the options array 
    } 
} 

然後當你實例化它,這是因爲像這樣簡單:

$user = User::factory('admin'); 
+1

+1是的,這是工廠模式的正確模型 – McKay 2011-12-28 22:58:18

+0

「定義創建對象的接口,但讓子類決定實例化哪個類。Factory方法讓類將實例化延遲到子類。 http://en.wikipedia.org/wiki/Factory_method_pattern#cite_ref-0 – McKay 2011-12-28 23:01:28

+0

帶有$ options數組的東西是沒有我可以使用的接口。數組可以包含所有內容,並且不包含任何類型的值。要知道我可以給這個創建方法什麼,我應該挖掘代碼並嘗試理解我可以定義的內容。 相比之下,班級定義了一個很好的簽名,我可以在那裏發言並確切知道我可以用它做什麼。如果你工作的用戶類,你知道你可以分配firstName .. – 2011-12-28 23:10:20

1

您是第只有可以決定這個的人。您應該考慮以下選項:

  1. 您的用戶實例在構造函數中總是需要相同類型的輸入嗎?那麼將它們傳遞給工廠方法是一個不錯的選擇。
  2. 是否返回的實例取決於你需要實例化類型的用戶?如果是這樣,您將不得不將正確的參數傳遞給工廠,以便它可以爲您做出決定。在不久的將來看看你需要什麼是很重要的。不要通過太多或太少。
  3. 可以創建一個DTO(數據傳輸對象)類來定義用戶的所有屬性。這樣,您可以將大量信息傳遞給工廠方法,並且可能對未來有更多的防範措施(如角色,權限等)。
  4. 有些人可能會說只是將所有的信息傳遞給工廠方法,所以所有的邏輯都可以通過工廠方法來執行,即使現在不需要。