Fabrika Fonksiyonları
Coddy'nin Lua Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 62 / 70.
Bu kurs boyunca, nesneleri doğrudan yapıcıları (constructors) çağırarak oluşturdunuz—Circle:new(), Rectangle:new() ve benzeri. Peki ya çağıran kodun hangi belirli sınıfın kullanılacağını bilmesine gerek kalmadan, belirli bir koşula bağlı olarak farklı türde nesneler oluşturmak isterseniz?
İşte burada Factory deseni devreye girer. Bir fabrika, basitçe nesneler oluşturan ve döndüren bir fonksiyondur. Temel avantajı, çağıranın nesne oluşturma detaylarını bilmesine gerek olmamasıdır; sadece fabrikadan neye ihtiyacı olduğunu ister.
local function createShape(shapeType)
if shapeType == "circle" then
return Circle:new(10)
elseif shapeType == "square" then
return Square:new(5)
end
end
-- Çağıranın Circle veya Square sınıfları hakkında bilgi sahibi olmasına gerek yoktur
local myShape = createShape("circle")
print(myShape:area())
Fabrika fonksiyonu bir string argümanı alır ve hangi sınıfın örneğinin oluşturulacağına karar verir. Bu, nesne oluşturma mantığını tek bir yerde merkezileştirir. Daha sonra yeni bir şekil türü eklerseniz, şekil oluşturan her kod parçasını değil, yalnızca fabrikayı değiştirirsiniz.
Fabrikalar; nesne oluşturma karmaşık kurulumlar içerdiğinde, uygulama detaylarını gizlemek istediğinizde veya nesnenin tam türü kullanıcı girişi ya da yapılandırma dosyaları gibi çalışma zamanı koşullarına bağlı olduğunda özellikle yararlıdır.
Görev
KolayHadi bir Evcil Hayvan Fabrikası (Pet Factory) kuralım! Evcil hayvanları her sınıfın yapılandırıcısını doğrudan çağırarak oluşturmak yerine, basit bir dize argümanına dayanarak doğru evcil hayvan türünü üreten bir fabrika fonksiyonu oluşturacaksınız.
Kodunuzu dört dosya halinde düzenleyeceksiniz:
Dog.lua: Evcil hayvanın adını saklayan bir:new(name)yapılandırıcısına sahip bir Dog sınıfı oluşturun."{name} says: Woof!"dizesini (burada {name} köpeğin adıdır) döndüren bir:speak()metodu ekleyin.Cat.lua: Aynı yapıda bir Cat sınıfı oluşturun—bir:new(name)yapılandırıcısı ve"{name} says: Meow!"döndüren bir:speak()metodu.PetFactory.lua: Fabrika (Factory) deseninin parladığı yer burasıdır! İki argüman alan bircreatePet(petType, name)fonksiyonu oluşturun: evcil hayvan türünü belirten bir dize ("dog"veya"cat") ve evcil hayvanın adı. Fonksiyon uygun evcil hayvan nesnesini döndürmelidir. Tür"dog"ise yeni bir Dog;"cat"ise yeni bir Cat döndürün.main.lua: PetFactory modülünüzü dahil edin (require). İki girdi okuyun: evcil hayvan türü ve evcil hayvanın adı. Evcil hayvanı oluşturmak için fabrika fonksiyonunuzu kullanın, ardından:speak()metodunu çağırın ve sonucu yazdırın.
Fabrika deseninin güzelliği, ana kodunuzun Dog veya Cat sınıflarını doğrudan dahil etmesine gerek kalmamasıdır—sadece fabrikayı bilir. Fabrika, hangi sınıfın örnekleneceğine dair tüm detayları halleder.
İki girdi alacaksınız:
- Evcil hayvan türü (
"dog"veya"cat") - Evcil hayvan adı (bir dize)
Örneğin, girdiler dog ve Buddy ise, çıktı şöyle olmalıdır:
Buddy says: Woof!Girdiler cat ve Whiskers ise, çıktı şöyle olmalıdır:
Whiskers says: Meow!Kopya kağıdı
Factory deseni, bir fonksiyonun verilen parametrelere göre nesneler oluşturup döndürdüğü bir tasarım desenidir. Çağıran tarafın hangi spesifik sınıfın örneklendiğini bilmesine gerek yoktur; bu kararı fabrika (factory) yönetir.
Bir fabrika fonksiyonu, nesne oluşturma mantığını merkezileştirir:
local function createShape(shapeType)
if shapeType == "circle" then
return Circle:new(10)
elseif shapeType == "square" then
return Square:new(5)
end
end
local myShape = createShape("circle")
print(myShape:area())
Factory deseninin avantajları:
- Uygulama detaylarını çağıran taraftan gizler
- Nesne oluşturmayı tek bir yerde merkezileştirir
- Yeni türler eklemeyi kolaylaştırır; sadece fabrikanın değiştirilmesi gerekir
- Nesne türünün çalışma zamanı koşullarına (kullanıcı girişi, yapılandırma vb.) bağlı olduğu durumlarda kullanışlıdır
- Nesne oluşturma karmaşık kurulumlar içerdiğinde yardımcı olur
Kendin dene
-- main.lua
-- Evcil hayvan oluşturmak için PetFactory'yi kullanın
local PetFactory = require('PetFactory')
-- Girdileri oku
local petType = io.read()
local petName = io.read()
-- YAPILACAK: Evcil hayvanı oluşturmak için PetFactory.createPet kullanın
-- YAPILACAK: Evcil hayvanın :speak() metodunu çağırın ve sonucu yazdırın
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Object Oriented Programming bölümündeki tüm dersler
1'Self' Kavramı
Fonksiyonlu TablolarAçık 'self'İki Nokta SözdizimiNokta vs İki NoktaÖzet - Hareket Eden Nokta4Proje: Dijital Banka
Proje KurulumuPara Yatırma Metodu7Çok Biçimlilik ve Geçersiz Kılma
Metotları Geçersiz KılmaÜst Sınıf Metotlarını ÇağırmaDuck TypingOrtak ArayüzTür KontrolüÖzet - Çalışan Rolleri2Sınıf Prototip Kalıbı
Prototip Kavramı__index ile Bağlama:new() KurucusuÖznitelikleri BaşlatmaBağımsız ÖrneklerÖzet - Araba Fabrikası5OOP'de Operatör Aşırı Yükleme
Nesneleri ToplamaNesneleri ÇıkarmaNesneleri BirleştirmeNesneleri Karşılaştırma (<, >)Özet - Cüzdan Matematiği8Kapsülleme
Adlandırma KurallarıGizlilik için Closure'larClosure'lar Aracılığıyla ErişimSalt Okunur TablolarDoğrulama MantığıÖzet - Güvenli Kasa11Tasarım Kalıpları (Lite)
Fabrika FonksiyonlarıSingleton TablosuIterator KalıbıObserver (Dinleyici)Özet - Logger Fabrikası3Nesne Durumu ve Davranışı
Örnek DeğişkenleriGetter MetotlarıSetter MetotlarıHesaplanmış ÖzelliklerString BiçimlendirmeEşitlik KontrolleriÖzet - Öğrenci Notu6Kalıtımın Temelleri
Kalıtım KurulumuMetot KalıtımıConstructor'ı GenişletmeAlt Sınıf Metotları EklemePaylaşılan ve BenzersizÖzet - Şekil Hiyerarşisi