Зачем нужен паттерн Builder если можно в прописать сеттеры в создаваемом классе
Чем плохо такое решение? Для чего создавать ещё один класс и дублировать туда свойства? Вижу только смысл если работа идет с готовым классом в котором уже есть куча аргументов в конструкторе
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();
}
}
<?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();