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.
Tantangan
MudahMari 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 enumPetTypedengan nilaiPET_DOG,PET_CAT, danPET_BIRD. Buat struct dasarPetyang berisi function pointer untukspeak(yang menerimaconst Pet*dan tidak mengembalikan nilai). Deklarasikan fungsi factorycreate_petyang menerimaPetTypedan mengembalikanPet*, serta fungsifree_petuntuk pembersihan.pet.c: Definisikan tiga struct hewan peliharaan konkret,Dog,Cat, danBird, masing-masing menyertakanPetsebagai member pertama. Implementasikan fungsi speak untuk setiap jenis:- Anjing mencetak:
Woof! - Kucing mencetak:
Meow! - Burung mencetak:
Tweet!
create_pet: gunakan pernyataan switch padaPetTypeuntuk memanggil konstruktor yang benar dan mengembalikan hasilnya sebagaiPet*. Untuk jenis yang tidak valid, kembalikanNULL. Implementasikanfree_petuntuk membebaskan memori yang dialokasikan.- Anjing mencetak:
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 fungsispeak-nya secara polimorfis melalui pointer dasarPet*, 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;
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar Pemrograman Modular
file headerProteksi includefile sumberFungsi StatisRingkasan: Kalkulator Modular4Enkapsulasi
Konsep Opaque PointerMendefinisikan Opaque StructGetter dan SetterValidasi pada SetterUlasan: Kotak Rahasia2Object dan method
Struct sebagai objectPointer 'self'Konsistensi constPointer vs nilaiMethod pembantuRangkuman: Pengelola Point5Proyek: Akun Bank Sederhana
Penyiapan ProyekImplementasi Akun3Siklus Hidup object
Pola KonstruktorPola DestruktorInisialisasi StackSalinan MendalamRangkuman: Pembungkus string6Pewarisan melalui Komposisi
Penyematan StructAturan Anggota PertamaMengakses Anggota ParentUpcastingRekap: Hierarki Bentuk9Proyek: Penggambar Bentuk
Ringkasan ProyekImplementasi LingkaranImplementasi Persegi PanjangPenggunaan PolimorfismeWadah BentukLatihan sendiri: Compiler C online