Строител (шаблон): Разлика между версии

Изтрито е съдържание Добавено е съдържание
SieBot (беседа | приноси)
м Робот Промяна: ko:빌더 패턴
Премахване на цялото съдържание на страницата
Ред 1:
'''Строител (Builder)''' е създаващ [[Шаблони за дизайн|шаблон за дизайн]], който се използва в [[Обектно-ориентирано програмиране|обектно-ориентираното]] [[програмиране]].
 
[[Цел]]та е да се раздели [[създаване]]то на сложен [[обект]] от неговото представяне (интерфейс), за да може с един и същ [[процес]] да се създават обекти с различно представяне.
 
[[Image:Builder UML class diagram.svg|thumb|center|700px|[[UML]] диаграма на шаблона Строител]]
 
== Примери ==
=== C++ ===
<source lang="cpp">
// Реализация на C++.
 
#include <iostream>
#include <memory>
#include <string>
 
// Product
class Pizza
{
private:
std::string dough;
std::string sauce;
std::string topping;
public:
Pizza() { }
~Pizza() { }
 
void SetDough(const std::string& d) { dough = d; };
void SetSauce(const std::string& s) { sauce = s; };
void SetTopping(const std::string& t) { topping = t; }
 
void ShowPizza()
{
std::cout << " Yummy !!!" << std::endl
<< "Pizza with Dough as " << dough
<< ", Sauce as " << sauce
<< " and Topping as " << topping
<< " !!! " << std::endl;
}
};
 
// Abstract Builder
class PizzaBuilder
{
protected:
std::auto_ptr<Pizza> pizza;
public:
PizzaBuilder() {}
virtual ~PizzaBuilder() {}
std::auto_ptr<Pizza> GetPizza() { return pizza; }
 
void createNewPizzaProduct() { pizza.reset (new Pizza); }
 
virtual void buildDough()=0;
virtual void buildSauce()=0;
virtual void buildTopping()=0;
 
};
 
// ConcreteBuilder
class HawaiianPizzaBuilder : public PizzaBuilder
{
public:
HawaiianPizzaBuilder() : PizzaBuilder() {}
~HawaiianPizzaBuilder(){}
 
void buildDough() { pizza->SetDough("cross"); }
void buildSauce() { pizza->SetSauce("mild"); }
void buildTopping() { pizza->SetTopping("ham and pineapple"); }
};
 
// ConcreteBuilder
class SpicyPizzaBuilder : public PizzaBuilder
{
public:
SpicyPizzaBuilder() : PizzaBuilder() {}
~SpicyPizzaBuilder() {}
 
void buildDough() { pizza->SetDough("pan baked"); }
void buildSauce() { pizza->SetSauce("hot"); }
void buildTopping() { pizza->SetTopping("pepperoni and salami"); }
};
 
// Director
class Waiter
{
private:
PizzaBuilder* pizzaBuilder;
public:
Waiter() : pizzaBuilder(NULL) {}
~Waiter() { }
void SetPizzaBuilder(PizzaBuilder* b) { pizzaBuilder = b; }
std::auto_ptr<Pizza> GetPizza() { return pizzaBuilder->GetPizza(); }
void ConstructPizza()
{
pizzaBuilder->createNewPizzaProduct();
pizzaBuilder->buildDough();
pizzaBuilder->buildSauce();
pizzaBuilder->buildTopping();
}
};
// Клиент поръчва 2 пици
int main()
{
Waiter waiter;
HawaiianPizzaBuilder hawaiianPizzaBuilder;
waiter.SetPizzaBuilder (&hawaiianPizzaBuilder);
waiter.ConstructPizza();
std::auto_ptr<Pizza> pizza = waiter.GetPizza();
pizza->ShowPizza();
SpicyPizzaBuilder spicyPizzaBuilder;
waiter.SetPizzaBuilder(&spicyPizzaBuilder);
waiter.ConstructPizza();
pizza = waiter.GetPizza();
pizza->ShowPizza();
return EXIT_SUCCESS;
}
</source>
 
=== C# ===
<source lang="csharp">
using System;
using System.Collections;
 
namespace Builder
{
 
public class MainApp
{
public static void Main()
{
// Create director and builders
Director director = new Director();
 
Builder b1 = new ConcreteBuilder1();
Builder b2 = new ConcreteBuilder2();
 
// Construct two products
director.Construct(b1);
Product p1 = b1.GetResult();
p1.Show();
 
director.Construct(b2);
Product p2 = b2.GetResult();
p2.Show();
 
// Wait for user
Console.Read();
}
}
 
// "Director"
 
class Director
{
// Builder uses a complex series of steps
public void Construct(Builder builder)
{
builder.BuildPartA();
builder.BuildPartB();
}
}
 
// "Builder"
 
abstract class Builder
{
public abstract void BuildPartA();
public abstract void BuildPartB();
public abstract Product GetResult();
}
 
// "ConcreteBuilder1"
 
class ConcreteBuilder1 : Builder
{
private readonly Product product = new Product();
 
public override void BuildPartA()
{
product.Add("PartA");
}
 
public override void BuildPartB()
{
product.Add("PartB");
}
 
public override Product GetResult()
{
return product;
}
}
 
// "ConcreteBuilder2"
 
class ConcreteBuilder2 : Builder
{
private readonly Product product = new Product();
 
public override void BuildPartA()
{
product.Add("PartX");
}
 
public override void BuildPartB()
{
product.Add("PartY");
}
 
public override Product GetResult()
{
return product;
}
}
 
// "Product"
 
class Product
{
private readonly ArrayList parts = new ArrayList();
 
public void Add(string part)
{
parts.Add(part);
}
 
public void Show()
{
Console.WriteLine("\nProduct Parts -------");
foreach (string part in parts)
Console.WriteLine(part);
}
}
}
</source>
=== Java ===
<source lang="java">
 
/** "Product" */
class Pizza {
private String dough = "";
private String sauce = "";
private String topping = "";
 
public void setDough(String dough) { this.dough = dough; }
public void setSauce(String sauce) { this.sauce = sauce; }
public void setTopping(String topping) { this.topping = topping; }
}
 
 
/** "Abstract Builder" */
abstract class PizzaBuilder {
protected Pizza pizza;
 
public Pizza getPizza() { return pizza; }
public void createNewPizzaProduct() { pizza = new Pizza(); }
 
public abstract void buildDough();
public abstract void buildSauce();
public abstract void buildTopping();
}
 
/** "ConcreteBuilder" */
class HawaiianPizzaBuilder extends PizzaBuilder {
public void buildDough() { pizza.setDough("cross"); }
public void buildSauce() { pizza.setSauce("mild"); }
public void buildTopping() { pizza.setTopping("ham+pineapple"); }
}
 
/** "ConcreteBuilder" */
class SpicyPizzaBuilder extends PizzaBuilder {
public void buildDough() { pizza.setDough("pan baked"); }
public void buildSauce() { pizza.setSauce("hot"); }
public void buildTopping() { pizza.setTopping("pepperoni+salami"); }
}
 
 
/** "Director" */
class Waiter {
private PizzaBuilder pizzaBuilder;
 
public void setPizzaBuilder(PizzaBuilder pb) { pizzaBuilder = pb; }
public Pizza getPizza() { return pizzaBuilder.getPizza(); }
 
public void constructPizza() {
pizzaBuilder.createNewPizzaProduct();
pizzaBuilder.buildDough();
pizzaBuilder.buildSauce();
pizzaBuilder.buildTopping();
}
}
 
 
/** Клиент поръчва пица. */
class BuilderExample {
public static void main(String[] args) {
Waiter waiter = new Waiter();
PizzaBuilder hawaiian_pizzabuilder = new HawaiianPizzaBuilder();
PizzaBuilder spicy_pizzabuilder = new SpicyPizzaBuilder();
 
waiter.setPizzaBuilder( hawaiian_pizzabuilder );
waiter.constructPizza();
 
Pizza pizza = waiter.getPizza();
}
}
</source>
 
===PHP===
 
<source lang="php">
/* Produit */
class Pizza {
private $_pate = "";
private $_sauce = "";
private $_garniture = "";
 
public function setPate($pate) { $this->_pate = $pate; }
public function setSauce($sauce) { $this->_sauce = $sauce; }
public function setGarniture($garniture) { $this->_garniture = $garniture; }
}
 
 
/* Monteur */
abstract class MonteurPizza {
protected $_pizza;
 
public function getPizza() { return $this->_pizza; }
public function creerNouvellePizza() { $this->_pizza = new Pizza(); }
 
abstract public function monterPate();
abstract public function monterSauce();
abstract public function monterGarniture();
}
 
/* MonteurConcret */
class MonteurPizzaHawaii extends MonteurPizza {
public function monterPate() { $this->_pizza.setPate("croisée"); }
public function monterSauce() { $this->_pizza.setSauce("douce"); }
public function monterGarniture() { $this->_pizza.setGarniture("jambon+ananas"); }
}
 
/* MonteurConcret */
class MonteurPizzaPiquante extends MonteurPizza {
public function monterPate() { $this->_pizza.setPate("feuilletée"); }
public function monterSauce() { $this->_pizza.setSauce("piquante"); }
public function monterGarniture() { $this->_pizza.setGarniture("pepperoni+salami"); }
}
 
 
/* Directeur */
class Serveur {
private $_monteurPizza;
 
public function setMonteurPizza(MonteurPizza $mp) { $this->_monteurPizza = $mp; }
public function getPizza() { return $this->_monteurPizza->getPizza(); }
 
public void construirePizza() {
$this->_monteurPizza->creerNouvellePizza();
$this->_monteurPizza->monterPate();
$this->_monteurPizza->monterSauce();
$this->_monteurPizza->monterGarniture();
}
}
 
/* Клиент поръчва пица. */
$serveur = new Serveur();
$monteurPizzaHawaii = new MonteurPizzaHawaii();
$monteurPizzaPiquante = new MonteurPizzaPiquante();
 
$serveur->setMonteurPizza($monteurPizzaHawaii);
$serveur->construirePizza();
 
$pizza = $serveur->getPizza();
</source>
 
[[Категория:Програмиране]]
{{софтуер-мъниче}}
 
[[ca:Builder]]
[[de:Erbauer (Entwurfsmuster)]]
[[en:Builder pattern]]
[[es:Builder (patrón de diseño)]]
[[fr:Monteur (patron de conception)]]
[[it:Builder]]
[[ja:Builder パターン]]
[[ko:빌더 패턴]]
[[pl:Budowniczy (wzorzec projektowy)]]
[[pt:Builder]]
[[ru:Строитель (шаблон проектирования)]]
[[uk:Будівник (шаблон проектування)]]
[[zh:生成器 (设计模式)]]