From 2c1768d079ce73e8d1e569cf1c03531b883138e0 Mon Sep 17 00:00:00 2001 From: Kulagin Alexey Date: Tue, 19 Jun 2012 13:16:36 +0400 Subject: [PATCH] add patterns abstract fabric, builder and bridge --- README | 0 README.md | 1 + abstract_factory/README.md | 22 +++++++++++ abstract_factory/abstract_factory.rb | 57 ++++++++++++++++++++++++++++ abstract_factory/sample.rb | 52 +++++++++++++++++++++++++ bridge/README.md | 1 + bridge/bridge.rb | 54 ++++++++++++++++++++++++++ bridge/sample.rb | 45 ++++++++++++++++++++++ builder/README.md | 1 + builder/builder.rb | 1 + builder/sample.rb | 1 + 11 files changed, 235 insertions(+) delete mode 100644 README create mode 100644 README.md create mode 100644 abstract_factory/README.md create mode 100644 abstract_factory/abstract_factory.rb create mode 100644 abstract_factory/sample.rb create mode 100644 bridge/README.md create mode 100644 bridge/bridge.rb create mode 100644 bridge/sample.rb create mode 100644 builder/README.md create mode 100644 builder/builder.rb create mode 100644 builder/sample.rb diff --git a/README b/README deleted file mode 100644 index e69de29..0000000 diff --git a/README.md b/README.md new file mode 100644 index 0000000..2e1df95 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +####Simple doc \ No newline at end of file diff --git a/abstract_factory/README.md b/abstract_factory/README.md new file mode 100644 index 0000000..33bfeeb --- /dev/null +++ b/abstract_factory/README.md @@ -0,0 +1,22 @@ +[Источник описания][source] + +####Абстрактная фабрика (Abstract factory) + + Порождающий шаблон проектирования, позволяющий изменять поведение системы, варьируя создаваемые объекты, при этом сохраняя интерфейсы. Он позволяет создавать целые группы взаимосвязанных объектов, которые, будучи созданными одной фабрикой, реализуют общее поведение. Шаблон реализуется созданием абстрактного класса Factory, который представляет собой интерфейс для создания компонентов системы (например, для оконного интерфейса он может создавать окна и кнопки). Затем пишутся наследующиеся от него классы, реализующие этот интерфейс. + +######Цель +Предоставляет интерфейс для создания семейств взаимосвязанных или взаимозависимых объектов, не специфицируя их конкретных классов. +######Плюсы +* изолирует конкретные классы; +* упрощает замену семейств продуктов; +* гарантирует сочетаемость продуктов. +######Минусы +* сложно добавить поддержку нового вида продуктов. +######Применимость +* Система не должна зависеть от того, как создаются, компонуются и представляются входящие в нее объекты. +* Входящие в семейство взаимосвязанные объекты должны использоваться вместе и вам необходимо обеспечить выполнение этого ограничения +* Система должна конфигурироваться одним из семейств составляющих ее объектов. +* Требуется предоставить библиотеку объектов, раскрывая только их интерфейсы, но не реализацию. + + +[source]: http://ru.wikipedia.org/wiki/%D0%90%D0%B1%D1%81%D1%82%D1%80%D0%B0%D0%BA%D1%82%D0%BD%D0%B0%D1%8F_%D1%84%D0%B0%D0%B1%D1%80%D0%B8%D0%BA%D0%B0_(%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)#.D0.9F.D1.80.D0.B8.D0.BC.D0.B5.D1.80_Ruby \ No newline at end of file diff --git a/abstract_factory/abstract_factory.rb b/abstract_factory/abstract_factory.rb new file mode 100644 index 0000000..50ec6bf --- /dev/null +++ b/abstract_factory/abstract_factory.rb @@ -0,0 +1,57 @@ +# Создание фабрики для реализации 1 +class RealisationFactory1 + def create_button + Realisation_1.new + end +end + +# Создание фабрики для реализации 2 +class RealisationFactory2 + def create_button + Realisation_2.new + end +end + +# Базовый клас +class BaseClass + attr_accessor :caption +end + +# Реализация класса +class Realisation_1 < BaseClass + def render + puts "I`m Realisation_1 #{@caption}" + end +end + +# Реализация класса +class Realisation_2 < BaseClass + def render + puts "I`m Realisation_2 #{@caption}" + end +end + +class Application + def initialize(factory) + button = factory.create_button + button.caption = 'Start' + button.render + end +end + + +class ApplicationRunner + def self.run + Application.new(self.createSpecificFactory) + end + + def self.createSpecificFactory + if use_realisation_1 + RealisationFactory1.new + else + RealisationFactory2.new + end + end +end + +ApplicationRunner.run diff --git a/abstract_factory/sample.rb b/abstract_factory/sample.rb new file mode 100644 index 0000000..2ee55de --- /dev/null +++ b/abstract_factory/sample.rb @@ -0,0 +1,52 @@ +class WinFactory + def create_button + WinButton.new + end +end + +class LinFactory + def create_button + LinButton.new + end +end + +class Button + attr_accessor :caption +end + +class WinButton < Button + def render + puts "I`m WinButton #{@caption}" + end +end + +class LinButton < Button + def render + puts "I`m LinButton #{@caption}" + end +end + +class Application + def initialize(factory) + button = factory.create_button + button.caption = 'Start' + button.render + end +end + + +class ApplicationRunner + def self.run + Application.new(self.createOsSpecificFactory) + end + + def self.createOsSpecificFactory + if RUBY_PLATFORM.downcase.include?("mswin") + WinFactory.new + else + LinFactory.new + end + end +end + +ApplicationRunner.run \ No newline at end of file diff --git a/bridge/README.md b/bridge/README.md new file mode 100644 index 0000000..9004914 --- /dev/null +++ b/bridge/README.md @@ -0,0 +1 @@ +####Bridge \ No newline at end of file diff --git a/bridge/bridge.rb b/bridge/bridge.rb new file mode 100644 index 0000000..81e8d93 --- /dev/null +++ b/bridge/bridge.rb @@ -0,0 +1,54 @@ +# При частом изменении класса, преимущества объектно-ориентированного подхода становятся очень полезными, +# позволяя делать изменения в программе, обладая минимальными сведениями о реализации программы. +# Шаблон bridge является полезным там, где часто меняется не только сам класс, но и то, что он делает. + +module Bridge + + # Абстракция нашей реализации + # определяем интерфейс абстракции + # хранит ссылку на объект Implementor + class Abstraction + attr_accessor :implementator + + def info + implementator.info + end + end + + # RefinedAbstraction - уточненная абстракция + # расширяет интерфейс, определенный абстракцией Abstraction + class RefinedAbstraction