Допустим мы имеем класс:
Код: Выделить всё
class Article
{
private $author;
private $title;
private $text;
public function getAuthor()
{
return $this->author;
}
public function setAuthor($author): void
{
$this->author = $author;
}
public function getTitle()
{
return $this->title;
}
public function setTitle($title): void
{
$this->title = $title;
}
public function getText()
{
return $this->text;
}
public function setText($text): void
{
$this->text = $text;
}
}
1)
Код: Выделить всё
class SomeArticleBuilder implements ArticleBuilder
{
/**
* @var \Article
*/
private $article;
public function __construct()
{
$this->article = new Article();
}
/**
* @return \Article
*/
public function getResult(): Article
{
return $this->article;
}
/**
* @return $this
*/
public function setAuthor(): ArticleBuilder
{
$this->article->setAuthor('some author');
return $this;
}
/**
* @return $this
*/
public function setTitle(): ArticleBuilder
{
$this->article->setTitle('article title');
return $this;
}
/**
* @return $this
*/
public function setText(): ArticleBuilder
{
$this->article->setTitle('article title');
return $this;
}
}
$builder = (new SomeArticleBuilder())->setTitle()->setAuthor()->setText()->getResult();
2 вариант:
Код: Выделить всё
interface ArticleBuilder
{
public function getResult(): Article;
public function setAuthor(string $author): self;
public function setTitle(string $title): self;
public function setText(string $text): self;
}
class SomeArticleBuilder implements ArticleBuilder
{
/**
* @var \Article
*/
private $article;
public function __construct()
{
$this->article = new Article();
}
/**
* @return \Article
*/
public function getResult(): Article
{
return $this->article;
}
/**
* @return $this
*/
public function setAuthor(string $author): ArticleBuilder
{
$this->article->setAuthor($author);
return $this;
}
/**
* @return $this
*/
public function setTitle(string $title): ArticleBuilder
{
$this->article->setTitle($title);
return $this;
}
/**
* @return $this
*/
public function setText(string $text): ArticleBuilder
{
$this->article->setTitle($text);
return $this;
}
}
$builder = (new SomeArticleBuilder())
->setTitle('some title')
->setAuthor('some author')
->setText('some text')
->getResult();
Вопрос:
1) Какой вариант являеться более правильным.
2) Будет ли адекватным решение сделать смешанный вариант?
Например:
Код: Выделить всё
interface ArticleBuilder
{
public function getResult(): Article;
public function setAuthor(string $author): self;
public function setTitle(): self;
public function setText(): self;
}
class SomeArticleBuilder implements ArticleBuilder
{
/**
* @var \Article
*/
private $article;
public function __construct()
{
$this->article = new Article();
}
/**
* @return \Article
*/
public function getResult(): Article
{
return $this->article;
}
/**
* @return $this
*/
public function setAuthor(string $author): ArticleBuilder
{
$this->article->setAuthor($author);
return $this;
}
/**
* @return $this
*/
public function setTitle(): ArticleBuilder
{
$this->article->setTitle('some title');
return $this;
}
/**
* @return $this
*/
public function setText(): ArticleBuilder
{
$this->article->setTitle('some text');
return $this;
}
}
$builder = (new SomeArticleBuilder())
->setTitle()
->setText()
->setAuthor('some author')
->getResult();