**Порождающие паттерны** - это паттерны, которые упрощают и абстрагируют создание информационных объектов. На которых базируется все ООП. **Фабричный метод (англ. 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() }