不同的类总是有一个共同属性的单一实例

时间:2015-11-11 21:15:06

标签: php oop object design-patterns

让我们来看制造商/汽车模型示例。模型有特定的制造商。所以,让我们说模型" Punto"," 500"," Panda"始终是制造商"菲亚特"。

如果模型分别是一个类,并且制造商是一个类实例,那么在没有制造商类的多个实例的情况下,使模型连接到制造商的最清洁/最佳解决方案是什么。通过构造函数设置它们是显而易见的,因为模型永远不会改变它的制造者。

让我们在简化的代码示例中显示我的问题:

class Manufacturer
{
    protected $name;

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

abstract class Car
{
    protected $manufacturer;

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

    abstract public function getModel();

    public function getManufacturer()
    {
        return $this->manufacturer;
    }
}

class ModelA extends Car
{
    public function getModel()
    {
        return 'A';
    }
}

class ModelB extends Car
{
    public function getModel()
    {
        return 'B';
    }
}

// The manufacturer instance
$manufacturerC = new Manufacturer('C');

// Setting the manufacturer for the models is obvious
// because they always get manufactured from the manufacturer "C"
// and never from a manufacturer "X"
$modelA = new ModelA($manufacturerC);
$modelB = new ModelB($manufacturerC);

1 个答案:

答案 0 :(得分:0)

我能提出以下最佳解决方案:

模型包含制造商的类名。通过这种方式,我可以从ManufacturerPool获取制造商实例,其中包含所有制造商的实例。

abstract class Manufacturer
{
    protected $name;

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

class ManufacturerC extends Manufacturer
{
    public function __construct()
    {
        parent::__construct('C');
    }
}

abstract class Car
{
    abstract public function getModel();

    abstract public function getManufacturer();
}

class ModelA extends Car
{
    public function getModel()
    {
        return 'A';
    }

    public function getManufacturer()
    {
        return C::class;
    }
}

class ModelB extends Car
{
    public function getModel()
    {
        return 'B';
    }

    public function getManufacturer()
    {
        return C::class;
    }
}

// The manufacturer instance
$manufacturerPool = new ManufacturerPool();
$manufacturerPool->add(new ManufacturerC());

$modelA = new ModelA();
$modelB = new ModelB();

$manufacturerPool->get($modelA->getManufacturer()); // Returns instance of "C"
$manufacturerPool->get($modelB->getManufacturer()); // Returns instance of "C"

这种解决方案的缺点是每个制造商都必须是一个自己的类。