2015-11-11 7 views
0

Давайте возьмем пример модели производителя/автомобиля. Модель имеет конкретного производителя. Итак, скажем, модели «Punto», «500», «Panda» всегда были производителями «Fiat».В разных классах всегда есть пример для совместного использования

Если модели являются по одному классу, а изготовитель представляет собой экземпляр класса, то что является самым чистым/лучшим решением для получения моделей, подключенных к производителю без наличия нескольких экземпляров класса производителя. Установка их через конструктор очевидна, потому что модель никогда не может измениться с того, кто ее производит.

Давайте покажем мою проблему в упрощенном примере коды:

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); 
+0

Я бы передал ссылку на экземпляр, используя & –

+0

@RonDadon, вот как работает мой пример кода. Но установка ссылки на производителя для моделей очевидна, потому что она всегда будет одинаковой. – TiMESPLiNTER

+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" 

Недостатком этого решения является то, что каждый производитель должен быть собственным классом.

Смежные вопросы