使用类来存储常量值

时间:2015-06-19 21:33:54

标签: design-patterns constants factory

根据以下示例,是否有更好的方法来存储所需的值。我试图在将字符串传递给工厂方法时避免任何可能的错误。

但是,这有什么问题吗?它是否易于测试,是否有更好的方法来实现同样的事情等。

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)
    }
}

1 个答案:

答案 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