Вопрос по паттерну builder

Обсуждаем, как правильно строить приложения
Ответить
orangesan
Сообщения: 1
Зарегистрирован: 2018.11.28, 01:47

Вопрос по паттерну builder

Сообщение orangesan »

Добрый день помогите разобраться с паттерном стоитель везде встречаю 2 реализации:

Допустим мы имеем класс:

Код: Выделить всё

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();
P.S: это мой первый пост, поэтому заранее извиняюсь.
Ответить