Fabrika Kalıbı
Coddy'nin Swift Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 43 / 57.
fabrika deseni, nesne oluşturma işlemini tek bir yerde toplar. Çağıranlar ihtiyaç duydukları şeyi, genellikle adına veya türüne göre ister ve hangi somut türün oluşturulduğunu bilmeden kullanıma hazır bir nesne alır:
protocol Shape { func area() -> Double }
struct Square: Shape { let side: Double; func area() -> Double { side * side } }
struct Circle: Shape { let r: Double; func area() -> Double { 3 * r * r } }
enum ShapeFactory {
static func make(_ kind: String, size: Double) -> (any Shape)? {
switch kind {
case "square": return Square(side: size)
case "circle": return Circle(r: size)
default: return nil
}
}
}
print(ShapeFactory.make("square", size: 3)!.area())
print(ShapeFactory.make("hexagon", size: 3) == nil)Çıktı:
9.0
trueÇağıran yalnızca protokole bağlıdır. Yeni bir şekil eklemek, şekilleri oluşturan her yeri değil, factory’yi değiştirmek anlamına gelir:
protocol Notifier { func send(_ m: String) -> String }
struct Email: Notifier { func send(_ m: String) -> String { "email: \(m)" } }
struct SMS: Notifier { func send(_ m: String) -> String { "sms: \(m)" } }
func makeNotifier(for user: String) -> any Notifier {
user.hasSuffix("@mail.com") ? Email() : SMS()
}
print(makeNotifier(for: "ada@mail.com").send("hi"))
print(makeNotifier(for: "555-0100").send("hi"))Çıktı:
email: hi
sms: hiTürün kendisindeki statik fabrika yöntemleri, kalıbın daha hafif bir biçimidir. Bir değer oluşturmanın yaygın yollarına ad verirler:
struct Color {
let r: Int, g: Int, b: Int
static func gray(_ v: Int) -> Color { Color(r: v, g: v, b: v) }
static let white = Color(r: 255, g: 255, b: 255)
}
print(Color.gray(100).g)
print(Color.white.b)Çıktı:
100
255ShapeFactory gibi durumları olmayan bir enum, fabrika işlevlerini gruplandırmanın yaygın bir yoludur: örneklenemez, bu nedenle tamamen bir ad alanı olarak çalışır.
enum ShapeFactory { // case yok: oluşturulamaz
static func make(_ kind: String, size: Double) -> (any Shape)? { ... }
}Görev
KolayFiyatlandırma planları için bir fabrika yazın. Plan protokolünde name ve price(forUsers:) -> Int bulunur. Free (0 ve yalnızca 3 kullanıcıya kadar; bunun üzerindeki fiyat, izin verilmediği anlamına gelen -1'dir), Team (kullanıcı başına 10) ve Enterprise (sabit 500 ve 100'ün üzerindeki kullanıcı başına 5) uygulamalarını gerçekleştirin. free, team veya enterprise için planı, diğer durumlarda ise nil döndüren PlanFactory.make(_:) işlevini tamamlayın.
Sağlanan kod plan,users satırlarını okur ve team for 12 users: 120, free does not allow 5 users veya unknown plan: gold çıktısını verir.
Kodunuz Plan.swift, Free.swift, Team.swift, Enterprise.swift ve PlanFactory.swift dosyalarına yerleştirilmelidir. main.swift sağlanan giriş/çıkış kodunu içerir ve düzenlenemez.
Kendin dene
// Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
var input: [String] = []
while let line = readLine() { input.append(line) }
for line in input {
let p = line.split(separator: ",").map(String.init)
let users = Int(p[1])!
guard let plan = PlanFactory.make(p[0]) else {
print("unknown plan: \(p[0])")
continue
}
let price = plan.price(forUsers: users)
print(price < 0 ? "\(plan.name) does not allow \(users) users" : "\(plan.name) for \(users) users: \(price)")
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1Sınıflar ve Nesneler
Dosyalarla ÇalışmaSınıfları TanımlamaMetotlar ve selfBaşlatıcılarSınıflar ReferanstırTekrar - Kütüphane Kartı4Kapsülleme
Erişim DenetimiDışarıdan Salt OkunurDurumu KorumaBaşarısız Olabilen BaşlatıcılarTekrar - Banka Hesabı7Polimorfizm ve Generic'ler
PolimorfizmTür DönüşümüGeneric FonksiyonlarGeneric TürlerTekrar - Şekil Hesaplayıcı2Struct Yapıları ve Değer Türleri
Struct YapılarıDeğer SemantiğiDeğiştirici MetotlarStruct mı Class mıTekrar - Envanter Öğesi5Kalıtım
Alt sınıflarMetotları Geçersiz KılmaBaşlatıcılar ve superfinal ve HiyerarşilerTekrar - Çalışan Hiyerarşisi11Proje: Kütüphane Yönetimi
Kitaplar ve ÜyelerKitap Ödünç AlmaKendi başına pratik yap: Swift playground