2010-08-21 56 views
0

我正在爲「PickupPoints」創建一個接口,每個拾取點需要能夠返回找到的所有拾取點以及拾取點細節和也許將來會有更多的信息。這沒關係下面的代碼:在PHP中創建一個接口,它可以指定一個類型來確定使用哪個類

<?php 

interface iPickupPoint 
{ 
    public function getPickupPoints($countryCode, $postalCode, $city); 
    public function getPickupPointDetails($pickupPointId); 
} 


class PickupPoint1 implements iPickupPoint{ 
    ... 
} 

class PickupPoint2 implements iPickupPoint{ 
    ... 
} 

的問題是,我不想叫PickupPoint1,PickupPoint2的類..他們的自我。 我想要一個像PickupPoint(PickupPointType)這樣的類,所以我只想給出拾取點的類型,並且類型需要是PickupPoint1,PickupPOint2,..

這怎麼辦?這甚至有可能嗎?這是最佳做法嗎?

+1

你爲什麼把各個提貨點在自己的類呢?他們與衆不同嗎? 這看起來像是你將類與實例和接口混淆在類中。 – 2010-08-21 07:05:03

+0

他們是不同的,因爲他們是不同的公司的服務,他們需要從不同的數據源(網絡服務,數據庫,...) – tom 2010-08-21 15:13:44

+0

啊哈,這解釋它:) 去工廠模式,我可能會建議更好的命名? :) – 2010-08-22 10:45:50

回答

4

你所描述的是工廠模式,所以是的,這是一個最佳實踐。

http://www.devshed.com/c/a/PHP/Design-Patterns-in-PHP-Factory-Method-and-Abstract-Factory/

你的工廠本身並不需要實現的接口。這可能是一個靜態類,甚至一個函數:

class PickupPointFactory{ 
    public static function create($type){ 
    /* your creation logic here */ 
    switch ($type) { 
     case "PickupPoint1" : 
     $obj = new PickupPoint1(); 
     break; 
     case "PickupPoint2" : 
     $obj = new PickupPoint2(); 
     break; 
    } 
    return $obj; 
    } 
} 

$newPoint = PickupPointFactory::create("PickupPoint2"); 

創建邏輯可不少更爲通用,以避免每次更改出廠你添加一個類應用程序:

class PickupPointFactory{ 
    public static function create($type, $options){ 
    /* your creation logic here */ 
    if(file_exists(dirname(__FILE__).'/'.$type.'.class.php')) { 
     require_once(dirname(__FILE__).'/'.$type.'.class.php'); 
     $obj = new $type($options); 
     return $obj; 
    } else { 
     throw new Exception('Unknown PickupPoint type: '.$type); 
    } 
    } 
} 

$newPoint = PickupPointFactory::create("PickupPoint2", array()); 

這一種是假設你在工廠所在的同一目錄中創建名爲「PickupPoint1.class.php」的文件中的類,並且類中的構造函數只需要一個參數。

我沒有測試此代碼,所以一些bug可能會溜進來的

+0

值得注意的是,工廠方法(在你的情況'create()')通常按照慣例命名爲'factory()'*。 – takeshin 2010-08-21 13:42:58

+0

我沒有意識到這一點。有沒有任何書目支持這個公約? – 2010-08-21 17:45:01

-1

我會創建1個拾取點函數,您可以在其中指定帶有if語句的拾取點編號。

Pickup Point ($pickuppointnum) { 

    if ($pickuppointnum == 1){ 
    //Pickup Point information for Pickuppoint #1 
    } 
    elseif ($pickuppointnum ==2) { 
    //Pickup Point information for Pickuppoint #2 
    } 
} 
+1

當我們有10個或更多拾取點時,這會變得很難看。 – tom 2010-08-21 06:02:19

相關問題