fabrika

Порождающие паттерны - это паттерны, которые упрощают и абстрагируют создание информационных объектов. На которых базируется все ООП.

Фабричный метод (англ. 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/pages/fabrika.txt
  • Последнее изменение: 2024/04/23 15:15
  • oresh.dm