Абстрактная фабрика (шаблон проектирования): различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[непроверенная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
Строка 903: Строка 903:
End Sub
End Sub
End Class
End Class
</source>
}}

=== Пример Ruby ===
{{Hider_hiding
| title = Исходный текст на языке [[Ruby]]
| content =
<source lang="Ruby">
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
</source>
</source>
}}
}}

Версия от 12:17, 17 августа 2011

Абстрактная фабрика
Abstract factory
Тип порождающий
Описан в Design Patterns Да

Абстрактная фабрика (англ. Abstract factory)порождающий шаблон проектирования, позволяющий изменять поведение системы, варьируя создаваемые объекты, при этом сохраняя интерфейсы. Он позволяет создавать целые группы взаимосвязанных объектов, которые, будучи созданными одной фабрикой, реализуют общее поведение. Шаблон реализуется созданием абстрактного класса Factory, который представляет собой интерфейс для создания компонентов системы (например, для оконного интерфейса он может создавать окна и кнопки). Затем пишутся наследующиеся от него классы, реализующие этот интерфейс.

Цель

Предоставляет интерфейс для создания семейств взаимосвязанных или взаимозависимых объектов, не специфицируя их конкретных классов.

Плюсы

  • изолирует конкретные классы;
  • упрощает замену семейств продуктов;
  • гарантирует сочетаемость продуктов.

Минусы

  • сложно добавить поддержку нового вида продуктов.

Применимость

  • Система не должна зависеть от того, как создаются, компонуются и представляются входящие в нее объекты.
  • Входящие в семейство взаимосвязанные объекты должны использоваться вместе и вам необходимо обеспечить выполнение этого ограничения.
  • Система должна конфигурироваться одним из семейств составляющих ее объектов.
  • Требуется предоставить библиотеку объектов, раскрывая только их интерфейсы, но не реализацию.

Пример Java

Пример С++

Пример С#

Пример JavaScript

Пример Delphi

Пример Python

На практике в Python этот паттерн применяется редко.

Пример PHP5

Пример VB.NET

Пример Ruby

См. также