Заранее извиняюсь за глупый вопрос, но меня терзают смутные сомнения что я делаю что-то не так, есть такой случай:
class Product {
//Some properties
//....
// \Models\OptionsInterface
protected $options;
// \Models\PriceInterface
protected $price;
protected $type;
public function setOptions($options)
{
if($this->type == ...some_condition_a && ...next_condition_a...)
{
$this->options = $this->factory->make('OptionsA', $options);
}
elseif($this->type == ...some_condition_b && ...next_condition_b ..)
{
//Some options logic
$options = ....
$this->options = $this->factory->make('OptionsB', $options);
}
//Также объект может и не иметь опций, в этом случае
//$this->options = null по-дефолту
}
public function setPrice($price)
{
$this->price = $this->factory->make('Price', $price);
}
}
class ConcreteProduct extends Product {
public function setOptions($options)
{
if($this->type == ...some_condition_a && ...next_condition_a...)
{
//Some options logic
$options = ....
$this->options = $this->factory->make('ConcreteOptionsA', $options);
}
elseif($this->type == ...some_condition_b && ...next_condition_b...)
{
//Some options logic
$options = ....
$this->options = $this->factory->make('ConcreteOptionsB', $options);
}
}
public function setPrice($price)
{
if($this->type == ...some_condition_a)
{
//Some price logic
$price = ...
$this->price = $this->factory->make('ConcretePriceA', $price);
}
elseif($this->type == ...some_condition_b)
{
$this->price = $this->factory->make('ConcretePriceB', $price);
}
else
{
$this->price = $this->factory->make('Price', $price);
}
}
}
//Работа с объектом осуществляется в таком роде
$product = new ConcreteProduct();
$product->setOptions($data['options']);
$product->setPrice($data['price']);
Проблема заключается в инициализации свойства $options и $price, количество наследников Product и типов $type может в будущем увеличиться, в следствии чего свойство $options будет иметь множество реализаций. Плодить наследников Product по типам также не очень хочется, как и городить кучу ветвлений. Есть идея создать фабрику для опций, но вот как описать логику выбора нужного класса... еще есть идея создать билдер для продуктов в зависимости от типа, но тут тоже есть сомнения...уже совсем запутался((
Заранее большое спасибо))