2015-06-19 38 views
1

有沒有更好的方法來存儲按照以下示例所需的值。我試圖在將字符串傳遞給工廠方法時避免任何可能的錯誤。使用一個類來存儲常量值

但是,這有什麼問題嗎?難道是容易測試,有沒有更好的方式來達到同樣的事情等

abstract class Types 
{ 
    const Car = 'car'; 
    const Boat = 'boat'; 
    const Bike = 'bike'; 
} 

class VehicleFactory { 

    public function make($type) 
    { 
     if ($type === Types::Car) { 
      // create new car 
     } 
     if ($type === Types::Boat) { 
      // create new Boat 
     } 
     if ($type === Types::Bike) { 
      // create new Bike 
     } 
    } 
} 

class Client 
{ 
    public function createACar() 
    { 
     $vehicleFactory = new VehicleFactory(); 
     $car = $vehicleFactory->create(Types::Car) 
    } 
} 
+0

Enum在這裏是正確的選擇。 – Sivaramvt

回答

2

這看起來像一個語言無關的問題,所以我會假設像使用該意見的enum,而不是一個abstract類奪得」工作。

您使用常量來表示要創建的對象類型的方法是正確的。如果我有任何改變,它就會成爲你Client類使用VehicleFactory以提供測試雙打,而單元測試代碼的方式:

class Client 
{ 

    private $factory; 

    public function __construct($factory){ 
     $this->factory = $factory; 
    }  

    public function createACar() 
    { 
     $car = $factory->create(Types::Car) 
    } 
} 

現在你可以在VehicleFactory子類通(比如說VehicleMockFactory)能夠創建測試雙打,而不是創建實際的對象:

class VehicleMockFactory extends VehicleFactory { 

    public function make($type) 
    { 
     if ($type === Types::Car) { 
      // create new TestCar 
     } 
     if ($type === Types::Boat) { 
      // create new TestBoat 
     } 
     if ($type === Types::Bike) { 
      // create new TestBike 
     } 
    } 
} 

雖然單元測試,你可以通過VehicleMockFactoryClient而不是實際VehicleFactory

+0

Types類應該作爲依賴項傳遞給工廠的構造函數嗎? –

+0

不,這不是必需的。 「類型」不是這樣的依賴。它沒有行爲,只定義了可以全局訪問的常量。 – CKing

相關問題