Зачем нужен паттерн Builder если можно в прописать сеттеры в создаваемом классе

Чем плохо такое решение? Для чего создавать ещё один класс и дублировать туда свойства? Вижу только смысл если работа идет с готовым классом в котором уже есть куча аргументов в конструкторе

Код с https://javarush.com/groups/posts/3822-kofe-breyk-124-pattern-proektirovanija-builder-kak-rabotaet-serializacija-i-deserializacija-v-j

public class Employee {

    private String name;
    private String company;
    private boolean hasCar;//optional
    private boolean hasBike;//optional

    private Employee(EmployeeBuilder employeeBuilder) {
        name = employeeBuilder.name;
        company = employeeBuilder.company;
        hasCar = employeeBuilder.hasCar;
        hasBike = employeeBuilder.hasBike;
    }

    public String getName() {
        return name;
    }

    public String getCompany() {
        return company;
    }

    public boolean isHasCar() {
        return hasCar;
    }

    public boolean isHasBike() {
        return hasBike;
    }

    public static class EmployeeBuilder {
        private String name;
        private String company;
        private boolean hasCar;//optional
        private boolean hasBike;//optional

        //constructor for required fields
        public EmployeeBuilder(String name, String company) {
            this.name = name;
            this.company = company;
        }

        //setter methods for optional fields
        public EmployeeBuilder setHasCar(boolean hasCar) {
            this.hasCar = hasCar;
            return this;
        }

        public EmployeeBuilder setHasBike(boolean hasBike) {
            this.hasBike = hasBike;
            return this;
        }

        //Build the Employee object
        public Employee build() {
            return new Employee(this);
        }
    }
}

class TestBuilder {
    public static void main(String[] args) {
        //Building the object of Employee thru the build() method provided in EmployeeBuilder class.
        Employee employee = new Employee.EmployeeBuilder("Vikram", "ABC").setHasBike(false).setHasBike(true).build();
    }
}

или с https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D0%BE%D0%B8%D1%82%D0%B5%D0%BB%D1%8C_(%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)

<?php

/**
 * Паттерн строитель, оперирует известными "рецептами строительства"
 */

/**
 * Pizza - Базовый объект строительства
 */
class Pizza {
    
    private $_pastry = "";
    private $_sauce = "";
    private $_garniture = "";

    public function setPastry($pastry) {
        $this->_pastry = $pastry;
    }
    public function setSauce($sauce) {
        $this->_sauce = $sauce;
    }
    public function setGarniture($garniture) {
        $this->_garniture = $garniture;
    }
    
}

/**
 * Builder - Абстрактный строитель
 */
abstract class BuilderPizza {
    
    protected $_pizza;

    public function getPizza() {
        return $this->_pizza;
    }
    public function createNewPizza() {
        $this->_pizza = new Pizza ();
    }

    abstract public function buildPastry();
    abstract public function buildSauce();
    abstract public function buildGarniture();
    
}

/**
 * BuilderConcret - Конкретный строитель 1
 */
class BuilderPizzaHawaii extends BuilderPizza {
    
    public function buildPastry() {
        $this->_pizza->setPastry ( "normal" );
    }
    public function buildSauce() {
        $this->_pizza->setSauce ( "soft" );
    }
    public function buildGarniture() {
        $this->_pizza->setGarniture ( "jambon+ananas" );
    }
    
}

/**
 * BuilderConcret - Конкретный строитель 2
 */
class BuilderPizzaSpicy extends BuilderPizza {
    
    public function buildPastry() {
        $this->_pizza->setPastry ( "puff" );
    }
    public function buildSauce() {
        $this->_pizza->setSauce ( "hot" );
    }
    public function buildGarniture() {
        $this->_pizza->setGarniture ( "pepperoni+salami" );
    }
    
}

/**
 * Director - Управляющий класс, запускающий строительство
 * PizzaBuilder - Реализация патерна Builder, показывающая делегирование процесса создания пиццы методу constructPizza
 */
class PizzaBuilder {
    private $_builderPizza;

    public function setBuilderPizza(BuilderPizza $mp)
    {
        $this->_builderPizza = $mp;
    }
    public function getPizza()
    {
        return $this->_builderPizza->getPizza();
    }
    public function constructPizza() {
        $this->_builderPizza->createNewPizza ();
        $this->_builderPizza->buildPastry ();
        $this->_builderPizza->buildSauce ();
        $this->_builderPizza->buildGarniture ();
    }
}

// Инициализация разносчика
$pizzaBuilder = new PizzaBuilder();

// Инициализация доступных продуктов
$builderPizzaHawaii  = new BuilderPizzaHawaii();
$builderPizzaPiquante = new BuilderPizzaSpicy();

// Подготовка и получение продукта
$pizzaBuilder->setBuilderPizza( $builderPizzaHawaii );
$pizzaBuilder->constructPizza();
$pizza = $pizzaBuilder->getPizza();

Ответы (0 шт):