Menu
Coddy logo textTech

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.

challenge icon

Görev

Kolay

Bir 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_CAT ve PET_BIRD değerlerine sahip bir PetType enum'u tanımlayın. speak için bir işlev işaretçisi içeren temel bir Pet struct'ı oluşturun (const Pet* alan ve hiçbir şey döndürmeyen). Bir PetType alan ve bir Pet* döndüren create_pet fabrika işlevini ve ayrıca temizleme için bir free_pet işlevini bildirin.
  • pet.c: Her biri ilk üye olarak Pet içeren üç somut evcil hayvan struct'ı, Dog, Cat ve Bird tanı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!
    Bellek ayıran ve uygun speak işlevini bağlayan her evcil hayvan türü için kurucu işlevler oluşturun. Ardından create_pet fabrikasını uygulayın: doğru kurucuyu çağırmak ve sonucu Pet* olarak döndürmek için PetType üzerinde bir switch deyimi kullanın. Geçersiz türler için NULL döndürün. Ayrılan belleği serbest bırakmak için free_pet işlevini uygulayın.
  • 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, temel Pet* işaretçisi üzerinden onun speak iş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;
}
quiz iconKendini test et

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

Kendi başına pratik yap: Online C derleyicisi