Pola Factory
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Swift di Coddy. Pelajaran 43 dari 57.
Pola factory menempatkan pembuatan object di satu tempat. Pemanggil meminta yang mereka butuhkan, biasanya berdasarkan nama atau tipe, lalu menerima object siap pakai tanpa mengetahui tipe konkret yang dibuat:
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)Output:
9.0
truePemanggil hanya bergantung pada protokol. Menambahkan bentuk baru berarti mengubah factory, bukan setiap tempat yang membuat bentuk:
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"))Output:
email: hi
sms: hiMethod factory statis pada tipe itu sendiri adalah bentuk pola ini yang lebih ringan. Method tersebut memberi nama pada cara umum untuk membangun sebuah nilai:
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)Output:
100
255Enum tanpa case, seperti ShapeFactory, adalah cara umum untuk mengelompokkan fungsi factory: enum ini tidak dapat dibuat sebagai instance, jadi hanya berfungsi sebagai namespace.
enum ShapeFactory { // tidak ada case: tidak bisa dibuat
static func make(_ kind: String, size: Double) -> (any Shape)? { ... }
}Tantangan
MudahBuat factory untuk paket harga. Protocol Plan memiliki name dan price(forUsers:) -> Int. Implementasikan Free (0, dan hanya untuk maksimal 3 pengguna: jika lebih dari itu, harganya -1 yang berarti tidak diizinkan), Team (10 per pengguna), dan Enterprise (biaya tetap 500 ditambah 5 per pengguna di atas 100). Lengkapi PlanFactory.make(_:), yang mengembalikan paket untuk free, team, atau enterprise, dan nil untuk selain itu.
Kode yang disediakan membaca baris plan,users dan mencetak team for 12 users: 120, free does not allow 5 users, atau unknown plan: gold.
Tulis kodemu di Plan.swift, Free.swift, Team.swift, Enterprise.swift, dan PlanFactory.swift. main.swift berisi kode input/output yang disediakan dan tidak boleh diedit.
Coba sendiri
// Kode input/output yang disediakan: biarkan tetap seperti semula
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)")
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Class dan Object
Bekerja dengan FileMendefinisikan ClassMethod dan selfInitializerClass adalah ReferensiUlasan: Kartu Perpustakaan4Enkapsulasi
Kontrol AksesHanya Bisa Dibaca dari LuarMelindungi StateInitializer yang Bisa GagalRangkuman: Rekening Bank7Polimorfisme dan Generik
PolimorfismeKonversi TipeFungsi GenerikTipe GenerikRangkuman: Kalkulator Bentuk2Struct dan Tipe Nilai
StructSemantik NilaiMethod yang Mengubah NilaiStruct atau classRangkuman, Item Inventaris11Proyek: Manajemen Perpustakaan
Buku dan AnggotaPeminjaman BukuLatihan sendiri: Playground Swift