Fabrika Fonksiyonları
Coddy'nin Lua Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 62 / 70.
Bu kurs boyunca nesneleri doğrudan yapıcıları çağırarak oluşturdun: Circle:new(), Rectangle:new() ve benzerleri. Peki ya çağıran kodun hangi belirli sınıfı kullanması gerektiğini bilmesine gerek kalmadan, bir koşula bağlı olarak farklı türlerde nesneler oluşturmak istersen?
İşte Factory pattern burada devreye girer. Factory, basitçe nesneler oluşturan ve döndüren bir işlevdir. Temel avantajı, çağıranın nesne oluşturmanın ayrıntılarını bilmesine gerek olmamasıdır. Sadece ihtiyaç duyduğu şeyi Factory’den 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ını bilmesine gerek yoktur
local myShape = createShape("circle")
print(myShape:area())
Fabrika işlevi bir dize bağımsız değişkeni alır ve hangi sınıfın örneklendirileceğine 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 bir kurulum içerdiğinde, uygulama ayrıntılarını gizlemek istediğinizde veya nesnenin kesin türü kullanıcı girdisi ya da yapılandırma dosyaları gibi çalışma zamanı koşullarına bağlı olduğunda özellikle kullanışlıdır.
Görev
KolayBir Pet Factory oluşturalım! Evcil hayvanları her sınıfın yapıcısını çağırarak doğrudan oluşturmak yerine, basit bir dize bağımsız değişkenine göre doğru türde evcil hayvanı üreten bir fabrika işlevi oluşturacaksın.
Kodunu dört dosyaya ayıracaksın:
Dog.lua: Evcil hayvanın adını saklayan:new(name)yapıcısına sahip bir Dog sınıfı oluştur.:speak()dizesini döndüren bir"{name} says: Woof!"yöntemi ekle ({name}, köpeğin adıdır).Cat.lua: Aynı yapıya sahip bir Cat sınıfı oluştur::new(name)yapıcısı ve:speak()döndüren bir"{name} says: Meow!"yöntemi.PetFactory.lua: Factory deseni burada öne çıkar! İki bağımsız değişken alan bircreatePet(petType, name)işlevi oluştur: evcil hayvan türünü belirten bir dize ("dog"veya"cat") ve evcil hayvanın adı. İşlev uygun evcil hayvan nesnesini döndürmelidir. Tür"dog"ise yeni bir Dog;"cat"ise yeni bir Cat döndür.main.lua: PetFactory modülünü require et. İki girdi oku: evcil hayvanın türü ve adı. Evcil hayvanı oluşturmak için fabrika işlevini kullan, ardından:speak()yöntemini çağır ve sonucu yazdır.
Factory deseninin güzelliği, ana kodunun Dog veya Cat'i doğrudan require etmek zorunda olmamasıdır. Ana kod yalnızca fabrikayı bilir. Hangi sınıfın örneklendirileceğine ilişkin tüm ayrıntıları fabrika yönetir.
İki girdi alacaksın:
- Evcil hayvan türü (
"dog"veya"cat") - Evcil hayvanın 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!Kendin dene
-- main.lua
-- Evcil hayvanlar oluşturmak için PetFactory'yi kullan
local PetFactory = require('PetFactory')
-- Girdileri oku
local petType = io.read()
local petName = io.read()
-- TODO: Evcil hayvanı oluşturmak için PetFactory.createPet kullan
-- TODO: Evcil hayvanın :speak() metodunu çağır ve sonucu yazdır
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
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şisiKendi başına pratik yap: Online Lua derleyicisi