Fabrika Kalıbı
Coddy'nin C Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 55 / 61.
Factory deseni, nesne oluşturma işlemini tek bir işlevde merkezileştirir. malloc ve başlatma kodunu programınızın her yerine dağıtmak yerine, ne oluşturulacağına karar veren ve kullanıma hazır bir nesne döndüren tek bir işlevi çağırırsınız.
Bu kalıp, polimorfizm ile birleştirildiğinde özellikle güçlüdür. Bir fabrika, oluşturma ayrıntılarını çağırandan gizleyerek ortak bir temel işaretçi üzerinden farklı somut türler döndürebilir. Çağıran yalnızca "a shape" ister ve fabrika bir daire, dikdörtgen veya başka bir şey oluşturup oluşturmayacağına karar verir.
İşte tipik bir fabrika uygulaması:
typedef enum {
SHAPE_CIRCLE,
SHAPE_RECTANGLE
} ShapeType;
Shape* create_shape(ShapeType type) {
switch (type) {
case SHAPE_CIRCLE:
return (Shape*)create_circle(5.0);
case SHAPE_RECTANGLE:
return (Shape*)create_rectangle(4.0, 3.0);
default:
return NULL;
}
}Fabrika bir tanımlayıcıyı (genellikle bir enum) alır ve hangi oluşturucunun çağrılacağını belirlemek için bir switch deyimi kullanır. Oluşturulan gerçek tür ne olursa olsun bir Shape* döndürür. Çağıranın Circle veya Rectangle hakkında bilgi sahibi olması gerekmez. Yalnızca temel türle çalışır:
Shape* s = create_shape(SHAPE_CIRCLE);
s->draw(s); // polimorfik çağrı
free_shape(s);Bu desen yeni türler eklemeyi kolaylaştırır: yalnızca yeni bir enum değeri ve fabrikada yeni bir case ekleyin. Kodunuzun geri kalanı değişmeden kalır.
Görev
KolayBir Pet Factory oluşturalım: tek bir fabrika işlevi aracılığıyla farklı evcil hayvan türleri oluşturan bir sistem. Oluşturma mantığını kodunuzun her yerine dağıtmak yerine, hangi evcil hayvan türünün oluşturulacağına bir giriş tanımlayıcısına göre karar veren tek bir yerde merkezileştireceksiniz.
Kodunuzu üç dosyada düzenleyeceksiniz:
pet.h:PET_DOG,PET_CATvePET_BIRDdeğerlerine sahip birPetTypeenum'u tanımlayın.speakiçin bir işlev işaretçisi içeren temel birPetstruct'ı oluşturun (const Pet*alan ve hiçbir şey döndürmeyen). BirPetTypealan ve birPet*döndürencreate_petfabrika işlevini ve ayrıca temizleme için birfree_petişlevini bildirin.pet.c: Her biri ilk üye olarakPetiçeren üç somut evcil hayvan struct'ı,Dog,CatveBirdtanımlayın. Her tür için bir speak işlevi uygulayın:- Köpekler şunu yazdırır:
Woof! - Kediler şunu yazdırır:
Meow! - Kuşlar şunu yazdırır:
Tweet!
create_petfabrikasını uygulayın: doğru kurucuyu çağırmak ve sonucuPet*olarak döndürmek içinPetTypeüzerinde bir switch deyimi kullanın. Geçersiz türler içinNULLdöndürün. Ayrılan belleği serbest bırakmak içinfree_petişlevini uygulayın.- Köpekler şunu yazdırır:
main.c: Evcil hayvan türünü temsil eden bir tam sayı okuyun (köpek için 0, kedi için 1, kuş için 2). Uygun evcil hayvanı oluşturmak için fabrikanızı kullanın, temelPet*işaretçisi üzerinden onunspeakişlevini polimorfik olarak çağırın, ardından evcil hayvanı serbest bırakın.
Programınız bir girdi alacaktır: oluşturulacak evcil hayvanı belirten bir tam sayı.
Girdi 0 olduğundaki örnek çıktı:
Woof!Girdi 1 olduğundaki örnek çıktı:
Meow!Girdi 2 olduğundaki örnek çıktı:
Tweet!Factory kalıbının güzelliği, main.c'nin Dog, Cat veya Bird struct'larını bilmek zorunda olmamasıdır. Yalnızca temel Pet türüyle çalışır. Daha sonra yeni bir evcil hayvan türü eklemek, evcil hayvanları kullanan hiçbir kodu değiştirmeden yeni bir enum değeri ve fabrikaya yeni bir case eklemek anlamına gelir.
Kendin dene
#include <stdio.h>
#include "pet.h"
int main(void) {
int type;
scanf("%d", &type);
// TODO: Uygun pet'i oluşturmak için factory'yi kullan
// İpucu: int'i PetType'a cast et
// TODO: speak fonksiyonunu Pet* pointer üzerinden polimorfik olarak çağır
// TODO: pet'i serbest bırak
return 0;
}
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
1Modüler Programlama Temelleri
Başlık DosyalarıInclude Guard'larKaynak DosyalarıStatik FonksiyonlarÖzet: Modüler Hesap Makinesi4Kapsülleme
Opaque Pointer KavramıOpaque Struct TanımlamaGetter ve Setter MetotlarıSetter Metotlarında DoğrulamaÖzet: Gizli Kutu2Nesneler ve Metotlar
Nesne Olarak Struct'lar'Self' İşaretçisiConst Doğruluğuİşaretçi vs DeğerYardımcı MetotlarÖzet: Point Manager5Proje: Basit Banka Hesabı
Proje KurulumuHesabın Oluşturulması3Nesne Yaşam Döngüsü
Constructor DeseniDestructor DeseniStack İlklendirmeDerin KopyalamaÖzet: String Wrapper6Kompozisyon Yoluyla Kalıtım
Struct Gömmeİlk Üye KuralıÜst Üyelere ErişimUpcastingÖzet: Şekil HiyerarşisiKendi başına pratik yap: Online C derleyicisi