Pola Desain Kreasional
Pola desain kreasional berfokus pada mekanisme penciptaan objek
1. Metode Pabrik (Factory Method)
Sebuah fungsi pabrik hanyalah sebuah fungsi yang menciptakan objek dan mengembalikannya. Ini adalah pola desain kreasional yang memungkinkan Anda untuk membuat objek tanpa menentukan kelas atau konstruktor yang tepat untuk digunakan. Ini mengkonsolidasikan logika penciptaan objek, memungkinkan fleksibilitas dalam penciptaan berbagai jenis objek. Katakanlah Anda memiliki situs web dan ingin membuat metode yang memungkinkan Anda dengan mudah membuat objek HTML dan menambahkannya ke DOM. Pabrik adalah solusi yang sempurna untuk ini, dan berikut adalah bagaimana kita dapat mengimplementasikannya.
1.1. Komponen Metode Pabrik
Pencipta (Creator)
Ini adalah metode yang diimplementasikan dalam Pabrik yang menciptakan produk baru.
Produk Abstrak (Abstract Product)
Antarmuka untuk produk yang sedang dibuat.
Produk Konkret (Concrete Product)
Ini adalah objek sebenarnya yang sedang dibuat.
1.2. Manfaat Metode Pabrik
Abstraksi Penciptaan Objek
Ini menghilangkan kompleksitas penciptaan objek, memungkinkan kode klien hanya fokus pada objek yang dibuat.
Fleksibilitas dan Kustomisasi
Pabrik memungkinkan kustomisasi proses penciptaan objek, memungkinkan variasi dalam objek yang dibuat.
Enkapsulasi Logika Penciptaan
Logika penciptaan terenkapsulasi dalam pabrik, membuatnya lebih mudah dimodifikasi atau diperluas tanpa memengaruhi kode klien.
Penciptaan Objek yang Kompleks
Pabrik berguna ketika penciptaan objek rumit, melibatkan beberapa langkah, atau memerlukan kondisi tertentu.
1.3. Contoh
function elementFactory(type, text, color) {
const newElement = document.createElement(type);
newElement.innerText = text;
newElement.style.color = color;
document.body.append(newElement);
function setText(newText) {
newElement.innerText = newText;
}
function setColor(newColor) {
newElement.innerText = newColor;
}
return {
newElement,
setText,
setColor,
};
}
const h1Tag = elementFactory("h1", "Teks Awal", "Biru");
h1Tag.setText("Halo dunia");
h1Tag.setColor("Merah");
2. Metode Pabrik Abstrak
Pabrik abstrak adalah pola desain pembuatan lainnya. Tujuannya utama adalah menyediakan antarmuka untuk menciptakan keluarga objek terkait atau bergantung tanpa menentukan kelas konkret mereka. Pola ini memastikan bahwa objek yang diciptakan kompatibel dan bekerja bersama.
2.1. 4 Komponen dari Pabrik Abstrak
Pabrik Abstrak
Ini mendefinisikan antarmuka untuk membuat produk abstrak, yang merupakan keluarga objek terkait (misalnya, komponen UI). Pabrik abstrak mendeklarasikan metode penciptaan untuk setiap jenis produk dalam keluarga.
Pabrik Konkrit
Ini adalah kelas yang mengimplementasikan antarmuka pabrik abstrak, menyediakan implementasi khusus untuk menciptakan produk konkret. Setiap pabrik konkret menciptakan keluarga produk terkait (misalnya, pabrik UI mungkin menciptakan tombol atau kotak centang).
Produk Abstrak
Ini adalah antarmuka atau kelas dasar untuk produk yang dibuat oleh pabrik abstrak. Setiap jenis produk dalam keluarga memiliki definisi produk abstraknya sendiri (misalnya, Tombol, Kotak Centang).
Produk Konkrit
Ini adalah implementasi aktual dari produk abstrak. Setiap pabrik konkret menciptakan seperangkat produk konkretnya sendiri. Produk konkrit mengimplementasikan antarmuka produk abstrak yang didefinisikan untuk keluarganya (misalnya, HTMLButton, WindowsButton).
2.2. Manfaat dari Pabrik Abstrak
Konsistensi
Ini memastikan bahwa objek yang dibuat kompatibel dan mengikuti tema atau gaya yang konsisten.
Pemisahan Tanggung Jawab
Ini mengisolasi penciptaan objek dari kode klien, mempromosikan pemisahan yang bersih antara perhatian.
Fleksibilitas dan Skalabilitas
Ini memungkinkan penambahan mudah keluarga produk baru tanpa mengubah kode klien yang ada.
2.3. Contoh
// Pabrik Abstrak: UIFactory
class UIFactory {
createButton() {
throw new Error('metode createButton harus di-override');
}
createCheckbox() {
throw new Error('metode createCheckbox harus di-override');
}
}
// Pabrik Konkret: WindowsUIFactory
class WindowsUIFactory extends UIFactory {
createButton() {
return new WindowsButton();
}
createCheckbox() {
return new WindowsCheckbox();
}
}
// Pabrik Konkret: MacUIFactory
class MacUIFactory extends UIFactory {
createButton() {
return new MacButton();
}
createCheckbox() {
return new MacCheckbox();
}
}
// Produk Abstrak: Tombol (Button)
class Button {
render() {
throw an Error('metode render harus di-override');
}
}
// Produk Konkret: WindowsButton
class WindowsButton extends Button {
render() {
console.log('Merender tombol Windows');
}
}
// Produk Konkret: MacButton
class MacButton extends Button {
render() {
console.log('Merender tombol Mac');
}
}
// Produk Abstrak: Checkbox
class Checkbox {
render() {
throw new Error('metode render harus di-override');
}
}
// Produk Konkret: WindowsCheckbox
class WindowsCheckbox extends Checkbox {
render() {
console.log('Merender checkbox Windows');
}
}
// Produk Konkret: MacCheckbox
class MacCheckbox extends Checkbox {
render() {
console.log('Merender checkbox Mac');
}
}
// Penggunaan
const windowsFactory = new WindowsUIFactory();
const macFactory = new MacUIFactory();
const windowsButton = windowsFactory.createButton();
windowsButton.render(); // Output: Merender tombol Windows
const macCheckbox = macFactory.createCheckbox();
macCheckbox.render(); // Output: Merender checkbox Mac
3. Pembangun (Builder)
Tujuan dari pembangun adalah untuk memisahkan konstruksi objek dari representasinya. Apa yang dilakukan pola pembangun adalah memungkinkan klien untuk membangun objek kompleks hanya dengan melewati jenis dan konten objek. Klien tidak perlu khawatir tentang detail konstruksi.
3.1. 4 Komponen dari Pembangun
Pembangun
Biasanya berisi serangkaian metode untuk membangun berbagai bagian objek.
Pembangun Konkrit
Mengimplementasikan metode dari antarmuka pembangun untuk membangun bagian-bagian objek.
Direktur (Opsional)
Ini tidak selalu diperlukan tetapi dapat membantu dalam membangun objek akhir menggunakan proses konstruksi tertentu.
Objek
Representasi produk akhir. Berisi bagian-bagian yang dibangun oleh pembangun.
3.2. Manfaat dari Pola Pembangun
Pemisahan Perhatian
Pola Pembangun memisahkan konstruksi objek kompleks dari representasinya, memungkinkan berbagai implementasi pembangun untuk bervariasi dalam representasi internal.
Penciptaan Objek yang Fleksibel
Ini memungkinkan penciptaan konfigurasi yang berbeda dari objek kompleks dengan menggunakan proses konstruksi yang umum. Pembangun dapat disesuaikan untuk menciptakan variasi objek tertentu.
Meningkatkan Keterbacaan
Menggunakan pembangun dapat meningkatkan keterbacaan kode dengan jelas menguraikan langkah-langkah yang diperlukan untuk membangun objek. Mudah memahami kontribusi setiap langkah pada objek akhir.
Konstruksi Berparameter
Pembangun memungkinkan Anda untuk membangun objek dengan melewati parameter ke langkah-langkah konstruksi, memberikan kontrol terperinci atas penciptaan dan konfigurasi objek.
Penggunaan Kembali
Pembangun dapat digunakan kembali untuk membuat beberapa instance objek kompleks dengan konfigurasi yang berbeda, mempromosikan penggunaan ulang kode dan meminimalkan duplikasi logika konstruksi.
3.3. Contoh
// Pembangun
class ComputerBuilder {
buildCPU() {}
buildRAM() {}
buildStorage() {}
getResult() {}
}
// Pembangun Konkret
class GamingComputerBuilder extends ComputerBuilder {
// Implementasikan langkah-langkah khusus untuk membangun komputer gaming
}
class OfficeComputerBuilder extends ComputerBuilder {
// Implementasikan langkah-langkah khusus untuk membangun komputer kantor
}
// Kelas Objek
class Computer {
constructor() {
this.parts = [];
}
addPart(part) {
this.parts.push(part);
}
}
// Direktur (Opsional)
class ComputerAssembler {
constructor(builder) {
this.builder = builder;
}
assembleComputer() {
this.builder.buildCPU();
this.builder.buildRAM();
this.builder.buildStorage();
return this.builder.getResult();
}
}
4. Singleton
Sebuah singleton adalah objek yang hanya bisa diinstansiasi sekali. Singleton berguna ketika tindakan sistem secara menyeluruh perlu diselaraskan dari satu tempat pusat tunggal. Singleton mengurangi kebutuhan untuk variabel global, yang sangat penting dalam JavaScript karena membatasi polusi ruang nama.
4.1. Komponen dari Singleton
Fungsi Anonim
Sebuah singleton diimplementasikan menggunakan fungsi anonim.
Fungsi getInstance
Ini adalah fungsi yang mengembalikan objek yang diinstansiasi secara unik.
Konstruktor (Opsional)
Dalam JavaScript, konstruktor tidak diperlukan untuk mengimplementasikan pola singleton, tetapi memiliki konstruktor umum karena memungkinkan Anda untuk mengkonfigurasi singleton dan menambahkan logika inisialisasi.
4.2. Manfaat dari Singleton
Mengurangi Variabel Global
Singleton dapat membantu mengurangi jumlah variabel global yang diperlukan dalam program Anda, mempromosikan organisasi kode yang lebih baik dan pemeliharaan.
Efisien Memori
Karena Singleton memastikan hanya ada satu instans yang ada pada satu waktu, memori disimpan karena Anda menghindari memiliki beberapa instans dari kelas yang sama.
Akses Global
Singleton menyediakan titik akses global ke instans. Ini memungkinkan bagian lain dari program untuk mengakses dan menggunakan instans yang sama tanpa perlu meneruskannya.
Berbagi Sumber Daya
Singleton sangat berguna ketika menangani tugas seperti mengelola sumber daya bersama. Singleton dapat digunakan untuk mengelola koneksi basis data, penangan berkas, dan bahkan grup benang, memastikan bahwa sumber daya ini dibagikan secara efisien di seluruh aplikasi.
4.3. Contoh
class Singleton {
constructor() {
const privateVariable = "Ini adalah variabel pribadi";
function privateMethod() {
console.log("Ini adalah metode pribadi.");
}
return {
publicMethod: function () {
console.log("Ini adalah metode publik.");
},
publicVariable: "Saya adalah publik",
};
}
static getInstance() {
if (!Singleton.instance) {
Singleton.instance = new Singleton();
}
return Singleton.instance;
}
}
const singletonInstance1 = Singleton.getInstance();
const singletonInstance2 = Singleton.getInstance();
console.log(singletonInstance1 === singletonInstance2); // Menghasilkan: true
5. Prototype
Pola prototipe adalah cara alternatif untuk mengimplementasikan warisan, tetapi perbedaan utamanya adalah daripada mewarisi properti dari sebuah kelas, objek mewarisi properti dari objek prototipe. Pola prototipe juga disebut pola properti, dan JavaScript mendukung prototipe secara alami. Dalam JavaScript, setiap objek memiliki prototipe (referensi ke objek lain). Ketika Anda mencoba mengakses properti yang tidak ada dalam objek itu sendiri, JavaScript akan mencarinya dalam prototipe objek dan terus naik ke prototipe hingga menemukannya atau mencapai ujung rantai prototipe.
5.1. Komponen dari Pola Prototipe
Objek Prototipe
Mengandung properti dan metode yang akan diwarisi oleh semua instansi baru.
Klien
Klien bertanggung jawab untuk membuat objek baru berdasarkan prototipe. Klien dapat membuat instansi baru berdasarkan prototipe dan memodifikasi properti-properti mereka sesuai kebutuhan.
Mekanisme Klona/Pembuatan
Mekanisme yang digunakan untuk membuat objek baru berdasarkan prototipe. Dalam JavaScript, ini dapat dicapai dengan menggunakan fungsi Object.create()
.
5.2. Manfaat dari Pola Prototipe
Penciptaan Instansi yang Efisien
Membuat instansi baru dari Prototipe lebih efisien daripada menggunakan kelas dan konstruktor tradisional. Objek dibuat dengan mengklon prototipe, yang mengurangi kebutuhan untuk mengatur kelas dan logika inisialisasi.
Penggunaan Kode Kembali
Pola Prototipe memungkinkan Anda untuk mendefinisikan seperangkat properti dan metode default dalam objek prototipe. Ini memungkinkan beberapa instansi untuk berbagi perilaku dan struktur yang sama tanpa menggandakan kode. Ini juga mengurangi penggunaan memori karena setiap instansi tidak perlu menyimpan salinan properti prototipe.
Penciptaan Objek yang Fleksibel
Objek yang dibuat menggunakan Pola Prototipe dapat dengan mudah disesuaikan dengan memodifikasi properti mereka atau menambahkan properti baru yang khusus untuk instansi.
Perubahan Runtime yang Dinamis
Perubahan yang dibuat pada objek prototipe selama runtime tercermin dalam semua instansi yang didasarkan pada prototipe. Perilaku ini memungkinkan pembaruan dan modifikasi pada prototipe, yang memengaruhi semua instansi yang berbagi prototipe yang sama.
5.3. Contoh
const cameraPrototype = {
model: "default",
make: "default",
shutter: function () {
console.log(`Kamera ${this.make} ${this.model} telah mengambil foto`);
},
};
const camera1 = Object.create(cameraPrototype);
camera1.model = "X-Pro 3";
camera1.make = "Fujifilm";
const camera2 = Object.create(cameraPrototype);
camera2.model = "R5";
camera2.make = "Canon";