Порождающие паттерны - это паттерны, которые упрощают и абстрагируют создание информационных объектов. На которых базируется все ООП.
Фабричный метод (англ. Factory Method), или виртуальный конструктор (англ. Virtual Constructor) — порождающий шаблон проектирования, предоставляющий подклассам (дочерним классам, субклассам) интерфейс для создания экземпляров некоторого класса. В момент создания наследники могут определить, какой класс создавать. Иными словами, данный шаблон делегирует создание объектов наследникам родительского класса. Это позволяет использовать в коде программы не конкретные классы, а манипулировать абстрактными объектами на более высоком уровне.
Цель Определяет интерфейс для создания объекта, но оставляет подклассам решение о том, на основании какого класса создавать объект. Фабричный метод позволяет классу делегировать создание подклассов. Используется, когда:
- классу заранее неизвестно, объекты каких подклассов ему нужно создавать.
- класс спроектирован так, чтобы объекты, которые он создаёт, специфицировались подклассами.
- класс делегирует свои обязанности одному из нескольких вспомогательных подклассов, и планируется локализовать знание о том, какой класс принимает эти обязанности на себя.
import Foundation //Factoty
enum ClothesType { case head case shoes }
protocol Clothes { var title: String { get } var type: ClothesType { get } var color: String { get } func putOn() }
class Hat: Clothes {
var title: String = "Шляпа" var type: ClothesType = .head var color: String = "черная"
func putOn() { print("Одета \(color) \(title)") }
}
class Shoes:Clothes {
var title: String = "Ботинки" var type: ClothesType = .shoes var color: String = "белые"
func putOn() { print("Одеты \(color) \(title)") }
}
class ClothesFactory {
static let shared = ClothesFactory() private init() { } //заприватим инициаизатор. чтобы не давало создавать объекты этого класса
func createClothes(type:ClothesType ) → Clothes {
switch type { case .head: return Hat() case .shoes:return Shoes() default: fatalError("Unsupported") }
} }
//Тестирование паттерна let hat = ClothesFactory.shared.createClothes(type: .head) let shoes = ClothesFactory.shared.createClothes(type: .shoes) let hat2 = ClothesFactory.shared.createClothes(type: .head)
var clothes: [Clothes] = [hat,shoes,hat2]
for clothes1 in clothes { clothes1.putOn() }