Skip to content

Commit

Permalink
add builder pattern
Browse files Browse the repository at this point in the history
  • Loading branch information
Coolagin committed Jun 25, 2012
1 parent 363b626 commit 6eb9aac
Show file tree
Hide file tree
Showing 3 changed files with 154 additions and 3 deletions.
17 changes: 16 additions & 1 deletion builder/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,19 @@

####Строитель(Builder)

![picture alt](https://github.com/Coolagin/patterns_doc/raw/master/images/uml-builder.jpg)
![picture alt](https://github.com/Coolagin/patterns_doc/raw/master/images/uml-builder.jpg)


######Цель
Отделяет конструирование сложного объекта от его представления, так что в результате одного и того же процесса конструирования могут получаться разные представления.

######Плюсы
* позволяет изменять внутреннее представление продукта;
* изолирует код, реализующий конструирование и представление;
* дает более тонкий контроль над процессом конструирования.

#####Применение
* алгоритм создания сложного объекта не должен зависеть от того, из каких частей состоит объект и как они стыкуются между собой;
* процесс конструирования должен обеспечивать различные представления конструируемого объекта.

[source]:http://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)
54 changes: 53 additions & 1 deletion builder/builder.rb
Original file line number Diff line number Diff line change
@@ -1 +1,53 @@
#FILE SHOULD HAVE STRUCTURE PATTERN
# 1. type builder interface

class Builder
def build_part1
end

def build_part2
end

def build_part3
end

end

# 2. type builder implementations

class ComputerBuilder < Builder
def build_part1
puts "Building part1: motherboard"
end

def build_part2
puts "Building part2: CPU"
end

def build_part3
puts "Building part3: display"
end
end

class TableBuilder < Builder
def build_part1
puts "Building part1: legs"
end

def build_part2
puts "Building part2: top"
end

def build_part3
puts "Building part3: mounting"
end
end

# 3. director

class Director
def construct(builder)
builder.build_part1
builder.build_part2
builder.build_part3
end
end
86 changes: 85 additions & 1 deletion builder/sample.rb
Original file line number Diff line number Diff line change
@@ -1 +1,85 @@
#FILE SHOULD SAMPLE PATTERN
#
# Базовый объект строительства
#
class Pizza
attr_accessor :pastry, :sauce, :garniture
end

#
# Builder - класс строитель
#
class BuilderPizza
attr_reader :pizza

def create_new_pizza
@pizza = Pizza.new
end

def get_pizza
"Your order. pastry: #{@pizza.pastry}, sauce: #{@pizza.sauce}, garniture: #{@pizza.garniture}"
end
end

#
# BuilderConcret - Конкретный строитель 1
#
class BuilderPizzaHawaii < BuilderPizza
def build_pastry
@pizza.pastry = 'normal'
end

def build_sauce
@pizza.sauce = 'soft'
end

def build_garniture
@pizza.garniture = 'jambon+ananas'
end
end

#
# BuilderConcret - Конкретный строитель 2
#
class BuilderPizzaSpicy < BuilderPizza
def build_pastry
@pizza.pastry = 'puff'
end

def build_sauce
@pizza.sauce = 'hot'
end

def build_garniture
@pizza.garniture = 'papperoni+salami'
end
end

#
# Director - Управляющий класс, запускающий строительство
#
class Waiter
def set_builder_pizza(bp)
@builder_pizza = bp
end

def get_pizza
@builder_pizza.get_pizza
end

def construct_pizza
@builder_pizza.create_new_pizza
@builder_pizza.build_pastry
@builder_pizza.build_sauce
@builder_pizza.build_garniture
end
end

waiter = Waiter.new

builder_pizza_hawaii = BuilderPizzaHawaii.new
builder_pizza_spicy = BuilderPizzaSpicy.new

waiter.set_builder_pizza(builder_pizza_hawaii)
waiter.construct_pizza

puts waiter.get_pizza

0 comments on commit 6eb9aac

Please sign in to comment.