Menu
CoddyTech

Pola Factory

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan C di Coddy. Pelajaran 55 dari 61.

Factory pattern memusatkan pembuatan object dalam satu fungsi. Alih-alih menyebarkan malloc dan kode inisialisasi ke seluruh programmu, kamu memanggil satu fungsi yang menentukan apa yang akan dibuat dan mengembalikan object yang siap digunakan.

Pola ini sangat bermanfaat jika digabungkan dengan polimorfisme. Factory dapat mengembalikan berbagai tipe konkret melalui pointer dasar yang sama, sehingga detail pembuatannya tersembunyi dari pemanggil. Pemanggil hanya meminta "sebuah bentuk", lalu factory menentukan apakah akan membuat lingkaran, persegi panjang, atau bentuk lainnya.

Berikut adalah implementasi factory yang umum:

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;
    }
}

Factory menerima identifier (biasanya enum) dan menggunakan pernyataan switch untuk menentukan constructor mana yang akan dipanggil. Factory mengembalikan Shape* apa pun tipe yang dibuat. Pemanggil tidak perlu mengetahui Circle atau Rectangle. Pemanggil cukup bekerja dengan tipe dasar:

Shape* s = create_shape(SHAPE_CIRCLE);
s->draw(s);  // pemanggilan polimorfik
free_shape(s);

Pola ini memudahkan penambahan tipe baru: cukup tambahkan nilai enum baru dan case baru di factory. Bagian kode lainnya tetap tidak berubah.

challenge icon

Tantangan

Mudah

Mari buat Pet Factory: sebuah sistem yang membuat berbagai jenis hewan peliharaan melalui satu fungsi factory. Daripada menyebarkan logika pembuatan ke seluruh kodemu, kamu akan memusatkannya di satu tempat yang menentukan jenis hewan peliharaan yang akan dibuat berdasarkan identifier input.

Kamu akan menyusun kodemu dalam tiga file:

  • pet.h: Definisikan enum PetType dengan nilai PET_DOG, PET_CAT, dan PET_BIRD. Buat struct dasar Pet yang berisi function pointer untuk speak (yang menerima const Pet* dan tidak mengembalikan nilai). Deklarasikan fungsi factory create_pet yang menerima PetType dan mengembalikan Pet*, serta fungsi free_pet untuk pembersihan.
  • pet.c: Definisikan tiga struct hewan peliharaan konkret, Dog, Cat, dan Bird, masing-masing menyertakan Pet sebagai member pertama. Implementasikan fungsi speak untuk setiap jenis:
    • Anjing mencetak: Woof!
    • Kucing mencetak: Meow!
    • Burung mencetak: Tweet!
    Buat fungsi konstruktor untuk setiap jenis hewan peliharaan yang mengalokasikan memori dan menghubungkan fungsi speak yang sesuai. Lalu implementasikan factory create_pet: gunakan pernyataan switch pada PetType untuk memanggil konstruktor yang benar dan mengembalikan hasilnya sebagai Pet*. Untuk jenis yang tidak valid, kembalikan NULL. Implementasikan free_pet untuk membebaskan memori yang dialokasikan.
  • main.c: Baca bilangan bulat yang menunjukkan jenis hewan peliharaan (0 untuk anjing, 1 untuk kucing, 2 untuk burung). Gunakan factory-mu untuk membuat hewan peliharaan yang sesuai, panggil fungsi speak-nya secara polimorfis melalui pointer dasar Pet*, lalu bebaskan hewan peliharaan tersebut.

Programmu akan menerima satu input: bilangan bulat yang menunjukkan hewan peliharaan yang akan dibuat.

Contoh output saat inputnya adalah 0:

Woof!

Contoh output saat inputnya adalah 1:

Meow!

Contoh output saat inputnya adalah 2:

Tweet!

Keunggulan pola Factory adalah main.c tidak perlu mengetahui struct Dog, Cat, atau Bird. Kode tersebut hanya menggunakan tipe dasar Pet. Menambahkan jenis hewan peliharaan baru nantinya hanya memerlukan penambahan nilai enum dan case baru di factory, tanpa mengubah kode apa pun yang menggunakan hewan peliharaan.

Coba sendiri

#include <stdio.h>
#include "pet.h"

int main(void) {
    int type;
    scanf("%d", &type);
    
    // TODO: Gunakan factory untuk membuat hewan peliharaan yang sesuai
    // Petunjuk: Konversikan int ke PetType dengan cast
    
    // TODO: Panggil fungsi speak secara polimorfis melalui pointer Pet*
    
    // TODO: Bebaskan memori hewan peliharaan
    
    return 0;
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler C online