Pola Pembuatan: Factory, Builder, Singleton
Kendalikan pembuatan objek dengan rapi menggunakan pola pembuatan.
Pola Pembuatan: Factory, Builder, Singleton adalah pelajaran PHP Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar PHP Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus PHP Academy mencakup 4 pelajaran total.
Mengendalikan pembuatan
Pola penciptaan memisahkan apa yang Anda butuhkan dari cara pembuatannya. Jika pembuatan bersyarat, terdiri dari banyak langkah, atau harus dipusatkan, menebarkan new di seluruh basis kode membuat pemanggil bergantung pada kelas konkret. Di sini kita membahas Pabrik (dan Metode Pabrik), Pembuat untuk perakitan kompleks, serta Pola Tunggal (beserta hal-hal yang perlu diperhatikan).
Pabrik Sederhana
Pabrik sederhana memusatkan keputusan pembuatan di balik satu metode. Pemanggil meminta tipe logis dan menerima instans konkret yang telah dikonfigurasi, tanpa mengetahui nama kelasnya.
<?php
interface Notifier { public function send(string $msg): string; }
final class EmailNotifier implements Notifier {
public function send(string $m): string { return "email: $m"; }
}
final class SmsNotifier implements Notifier {
public function send(string $m): string { return "sms: $m"; }
}
final class NotifierFactory {
public static function make(string $channel): Notifier {
return match ($channel) {
'email' => new EmailNotifier(),
'sms' => new SmsNotifier(),
default => throw new InvalidArgumentException($channel),
};
}
}
echo NotifierFactory::make('sms')->send('Hi'), PHP_EOL;
Metode Pabrik
Pola Metode Pabrik menunda pembuatan instans ke subkelas. Kelas dasar mendefinisikan algoritme yang memanggil create() abstrak; setiap subkelas menentukan produk konkret. Ini mendukung OCP: tambahkan pembuat baru tanpa mengubah yang sudah ada.
<?php
abstract class ReportExporter {
abstract protected function create(): string;
public function export(): string {
return 'Exported as ' . $this->create();
}
}
final class PdfExporter extends ReportExporter {
protected function create(): string { return 'PDF'; }
}
final class CsvExporter extends ReportExporter {
protected function create(): string { return 'CSV'; }
}
echo (new PdfExporter())->export(), PHP_EOL;
echo (new CsvExporter())->export(), PHP_EOL;
Pabrik Abstrak
Pabrik Abstrak menghasilkan keluarga objek terkait yang harus digunakan bersama (misalnya MySqlConnection + MySqlQueryBuilder). Ini menjamin bagian-bagiannya kompatibel karena satu pabrik menghasilkan seluruh rangkaian. Gunakan ini ketika satu keluarga produk harus tetap konsisten secara internal.
Pembuat: masalahnya
Saat objek memerlukan banyak parameter opsional, konstruktor berkembang menjadi daftar argumen posisi yang sulit dibaca atau kelebihan beban bertingkat yang bahkan tidak dimiliki PHP. Pola Pembuat merakit objek kompleks langkah demi langkah, lalu mengembalikan produk yang selesai dan valid.
Pembuat Fasih
Pembuat fasih mengembalikan $this dari setiap penyetel, lalu build() menghasilkan hasil yang tidak dapat diubah. Dengan demikian, produk itu sendiri tetap sederhana dan logika perakitan dialihkan ke dalam pembuat.
<?php
final class Query {
public function __construct(public readonly string $sql) {}
}
final class QueryBuilder {
private string $table = '';
private array $where = [];
public function from(string $t): self { $this->table = $t; return $this; }
public function where(string $c): self { $this->where[] = $c; return $this; }
public function build(): Query {
$sql = "SELECT * FROM {$this->table}";
if ($this->where) { $sql .= ' WHERE ' . implode(' AND ', $this->where); }
return new Query($sql);
}
}
echo (new QueryBuilder())->from('users')->where('age > 18')->build()->sql, PHP_EOL;
Pembuat vs konstruktor bernama
Untuk kasus yang lebih sederhana, argumen bernama PHP 8 dan konstruktor bernama (metode pabrik statis) sering kali lebih baik daripada pembuat lengkap.
- Gunakan argumen bernama jika semua data tersedia sekaligus.
- Gunakan pembuat jika perakitan terdiri dari banyak langkah, bersyarat, atau digunakan ulang di berbagai lokasi pemanggilan.
<?php
final class Money {
private function __construct(public readonly int $cents, public readonly string $cur) {}
public static function fromDollars(float $d): self {
return new self((int) round($d * 100), 'USD');
}
public static function zero(string $cur = 'USD'): self {
return new self(0, $cur);
}
}
var_dump(Money::fromDollars(19.99)->cents); // int(1999)
Pola Tunggal
Pola Tunggal menjamin satu instans dengan titik akses global. Implementasikan dengan konstruktor privat dan pengakses statis. Pola ini benar-benar berguna untuk hal-hal yang memang harus unik dalam suatu proses, tetapi juga merupakan pola yang paling sering disalahgunakan.
<?php
final class Config {
private static ?self $instance = null;
private array $data = ['debug' => true];
private function __construct() {}
public static function instance(): self {
return self::$instance ??= new self();
}
public function get(string $k): mixed { return $this->data[$k] ?? null; }
}
var_dump(Config::instance()->get('debug'));
var_dump(Config::instance() === Config::instance()); // true
Mengapa Pola Tunggal bermasalah
Pola tunggal memperkenalkan keadaan global tersembunyi: pemanggil mengakses Config::instance() alih-alih mendeklarasikan dependensi, sehingga kemampuan pengujian dan eksekusi paralel terganggu. Dalam PHP modern, lebih baik daftarkan satu instans bersama dalam wadah DI (siklus hidup "instans tunggal") dan injeksikan instans tersebut. Anda mendapatkan satu instans tanpa keterikatan global.
Memilih alat yang tepat
- Pabrik Sederhana/Metode Pabrik: sembunyikan kelas konkret di balik keputusan pembuatan.
- Pabrik Abstrak: hasilkan keluarga produk yang kompatibel.
- Pembuat: rakit objek kompleks langkah demi langkah.
- Pola Tunggal: pilihan terakhir; lebih baik gunakan layanan bersama yang dikelola wadah.
Keempatnya mengurangi keterikatan pada konstruktor konkret, sehingga kode lebih mudah diperluas dan diuji.
Pabrik berbasis registri
Pabrik yang lebih dinamis mencari pembuat di dalam registri, sehingga tipe baru mendaftarkan dirinya sendiri tanpa mengubah pabrik (OCP yang sesungguhnya). Inilah cara sistem pengaya dan serialisasi menerjemahkan nama tipe menjadi konstruktor saat waktu berjalan.
<?php
interface Shape { public function name(): string; }
final class Circle implements Shape { public function name(): string { return 'circle'; } }
final class Square implements Shape { public function name(): string { return 'square'; } }
final class ShapeRegistry {
private array $creators = [];
public function register(string $key, callable $factory): void {
$this->creators[$key] = $factory;
}
public function create(string $key): Shape {
return ($this->creators[$key] ?? throw new InvalidArgumentException($key))();
}
}
$r = new ShapeRegistry();
$r->register('circle', fn() => new Circle());
$r->register('square', fn() => new Square());
echo $r->create('square')->name(), PHP_EOL; // square
Pemeriksaan Singkat
Pilih alat penciptaan terbaik untuk skenario tersebut.
Ringkasan
Anda mengendalikan pembuatan objek dengan pola penciptaan: pabrik untuk menyembunyikan tipe konkret dan memilih keluarga produk, pembuat untuk merakit objek kompleks secara fasih, serta Pola Tunggal beserta komprominya. Kesimpulan modernnya: gunakan pabrik dan pembuat dengan leluasa, tetapi ganti Pola Tunggal dengan siklus hidup instans bersama milik wadah DI agar dependensi tetap eksplisit dan mudah diuji.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Pola Pembuatan: Factory, Builder, Singleton” gratis?
Ya — teks lengkap “Pola Pembuatan: Factory, Builder, Singleton” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus PHP Academy, upgrade ke CoddyKit PRO. Kursus PHP Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Pola Pembuatan: Factory, Builder, Singleton”?
Kendalikan pembuatan objek dengan rapi menggunakan pola pembuatan. Kamu berlatih PHP Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai PHP Academy?
Tidak diperlukan pengalaman sebelumnya. PHP Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.
Berapa lama pelajaran “Pola Pembuatan: Factory, Builder, Singleton” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran PHP Academy ini?
Ya. Setiap pelajaran PHP Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Prinsip SOLID dalam Praktik
- Pola Pembuatan: Factory, Builder, Singleton
- Pola Struktural: Adapter, Decorator, Facade
- Pola Perilaku: Strategy, Observer, Command