根据以下示例,是否有更好的方法来存储所需的值。我试图在将字符串传递给工厂方法时避免任何可能的错误。
但是,这有什么问题吗?它是否易于测试,是否有更好的方法来实现同样的事情等。
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 :(得分: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
}
}
}
在进行单元测试时,您可以将VehicleMockFactory
传递给Client
而不是实际的VehicleFactory
。