fabrika

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
fabrika [2024/04/23 15:05]
oresh.dm создано
fabrika [2024/04/23 15:15] (текущий)
oresh.dm
Строка 1: Строка 1:
-Порождающие паттерны - это паттерны, которые упрощают и абстрагируют создание информационных объектов. На которых базируется все ООП.+**Порождающие паттерны** - это паттерны, которые упрощают и абстрагируют создание информационных объектов. На которых базируется все ООП.
  
 +**Фабричный метод (англ. 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()
 +  }
  
  • /sites/data/attic/fabrika.1713884703.txt.gz
  • Последнее изменение: 2024/04/23 15:05
  • oresh.dm