Bilder.pptx
- Количество слайдов: 15
Паттерн Builder Название и классификация паттерна Строитель - паттерн, порождающий объекты. Назначение Отделяет конструирование сложного объекта от его представления, так что в результате одного и того же процесса конструирования могут получаться разные представления.
Мотивация Паттерн Builder
Паттерн Builder Применимость алгоритм создания сложного объекта не должен зависеть от того, из каких частей состоит объект и как они стыкуются между собой; процесс конструирования должен обеспечивать различные представления конструируемого объекта.
Паттерн Builder Структура
Паттерн Builder Участники Builder (Text. Converter) - строитель: задает абстрактный интерфейс для создания частей объекта Product; Concrete. Builder(ASCIIConverter, Te. XConverter, Text. Widget. Converter) -конкретный строитель: конструирует и собирает вместе части продукта посредством реализации интерфейса Builder; определяет создаваемое представление и следит за ним; предоставляет интерфейс для доступа к продукту (например, Get. ASCI IText, Get. Text. Widget); Director (RTFReader) - распорядитель: конструирует объект, пользуясь интерфейсом Builder; Product (ASCIIText, Te. XText, Text. Widget) - продукт: представляет сложный конструируемый объект. Concrete. Builder строит внутреннее представление продукта и определяет процесс его сборки; включает классы, которые определяют составные части, в том числе интерфейсы для сборки конечного результата из частей.
Метафора «Фабрика» — это автомат по продаже напитков, в нем уже есть всё готовое (или «осталось разогреть» ), а вы только говорите что вам нужно (нажимаете кнопку). «Строитель» — это завод, который производит эти напитки и содержит в себе все сложные операции и может собирать сложные объекты из более простых (упаковка, этикетка, вода, ароматизаторы и т. п. ) в зависимости от запроса.
Схема использования: Клиент создает объект-распорядитель Director и конфигурирует его нужным объектом-строителем Builder Распорядитель уведомляет строителя о том, что нужно построить очередную часть продукта Строитель обрабатывает запросы распорядителя и добавляет новые части к продукту Клиент забирает продукт у строителя
Достоинства паттерна: разное Позволяет задавать внутреннее представление продукта Отделяет процесс конструирования объектов от процесса создания их внутреннего представления Дает полный, более тонкий контроль над процессом конструирования
Пример /** "Product" */ class Pizza { private String dough = ""; private String sauce = ""; private String topping = ""; public void set. Dough(String dough) { this. dough = dough; } public void set. Sauce(String sauce) { this. sauce = sauce; } public void set. Topping(String topping) { this. topping = topping; } }
/** "Abstract Builder" */ abstract class Pizza. Builder { protected Pizza pizza; public Pizza get. Pizza() { return pizza; } public void create. New. Pizza. Product() { pizza = new Pizza(); } public abstract void build. Dough(); public abstract void build. Sauce(); public abstract void build. Topping(); } задает абстрактный интерфейс для создания частей объекта Product;
/** "Concrete. Builder" */ class Hawaiian. Pizza. Builder extends Pizza. Builder { public void build. Dough() { pizza. set. Dough("cross"); } public void build. Sauce() { pizza. set. Sauce(" мягкий"); } public void build. Topping() { pizza. set. Topping( «ветчина+ананас"); } } /** "Concrete. Builder" */ class Spicy. Pizza. Builder extends Pizza. Builder { public void build. Dough() { pizza. set. Dough( «запеченное"); } public void build. Sauce() { pizza. set. Sauce( «острый"); } public void build. Topping() {pizza. set. Topping( «папперони+салями"); } }
/** "Director" */ class Waiter { private Pizza. Builder pizza. Builder; public void set. Pizza. Builder(Pizza. Builder pb) { pizza. Builder = pb; } public Pizza get. Pizza() { return pizza. Builder. get. Pizza(); } public void construct. Pizza() { pizza. Builder. create. New. Pizza. Product(); pizza. Builder. build. Dough(); pizza. Builder. build. Sauce(); pizza. Builder. build. Topping(); }} конструирует объект, пользуясь интерфейсом Builder;
/** A customer ordering a pizza. */ class Builder. Example { public static void main(String[] args) { Waiter waiter = new Waiter(); Pizza. Builder hawaiian. Pizza. Builder = new Hawaiian. Pizza. Builder(); waiter. set. Pizza. Builder(hawaiian. Pizza. Builder); waiter. construct. Pizza(); Pizza pizza = waiter. get. Pizza(); } }
Вопросы Каковы компоненты биледра? • • • Конкретный билдер, продукт, клиент Директор, клиент, билдер Билдер, конкретный билдер, директор, продукт К какому виду паттернов относится билдер? • • • Структурный Поведенческий Порождающий
Что являет собой сам билдер? • • • Объект, инициализируемый во время первого обращения к нему Класс, который может иметь только один экземпляр. Класс, который представляет собой интерфейс для создания сложного объекта
Bilder.pptx