Pola Builder
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan C++ di Coddy. Pelajaran 93 dari 104.
Pola Builder memisahkan proses pembuatan object kompleks dari representasinya, sehingga kamu bisa membuat berbagai konfigurasi langkah demi langkah. Pola ini sangat berguna saat sebuah object memiliki banyak parameter opsional atau memerlukan urutan pembuatan tertentu.
Sebagai ganti constructor dengan banyak parameter yang membingungkan, Builder menyediakan method bernama yang jelas untuk setiap opsi konfigurasi:
#include <iostream>
#include <string>
class Pizza {
public:
std::string dough;
std::string sauce;
std::string topping;
bool cheese;
void describe() const {
std::cout << dough << " dough, " << sauce << " sauce, "
<< topping << (cheese ? ", with cheese" : "") << "\n";
}
};
class PizzaBuilder {
private:
Pizza pizza;
public:
PizzaBuilder& setDough(const std::string& d) {
pizza.dough = d;
return *this;
}
PizzaBuilder& setSauce(const std::string& s) {
pizza.sauce = s;
return *this;
}
PizzaBuilder& setTopping(const std::string& t) {
pizza.topping = t;
return *this;
}
PizzaBuilder& addCheese() {
pizza.cheese = true;
return *this;
}
Pizza build() { return pizza; }
};
int main() {
Pizza margherita = PizzaBuilder()
.setDough("thin")
.setSauce("tomato")
.setTopping("basil")
.addCheese()
.build();
margherita.describe();
}Setiap method setter mengembalikan referensi ke builder (return *this), sehingga kamu dapat merangkai method untuk membuat antarmuka yang lancar. Method build() menyelesaikan proses dan mengembalikan object yang telah dibuat.
Gunakan Builder saat membuat object dengan banyak komponen opsional, saat kamu ingin kode pembuatan yang mudah dibaca, atau saat proses pembuatan yang sama harus menghasilkan representasi yang berbeda.
Tantangan
MudahMari buat sistem Computer Builder yang memungkinkan pengguna mengonfigurasi PC khusus langkah demi langkah. Ini adalah skenario yang tepat untuk pola Builder: komputer memiliki banyak komponen opsional, dan kita menginginkan cara yang rapi dan mudah dibaca untuk merakit berbagai konfigurasi.
Kamu akan mengatur kodemu dalam tiga file:
Computer.h: Definisikan class produk yang mewakili komputer dengan konfigurasi lengkap.Class
Computerkamu harus menyimpan komponen berikut sebagai anggota private:cpu(string),ram(string),storage(string),gpu(string), danhasWifi(boolean). Atur nilai awalhasWifimenjadifalsedan string menjadi kosong secara default.Tambahkan method public bernama
showSpecs()untuk menampilkan konfigurasi komputer. Untuk setiap komponen yang telah diatur (string yang tidak kosong), tampilkan pada baris tersendiri. Kemampuan wifi hanya boleh ditampilkan jika diaktifkan.ComputerBuilder.h: Buat class builder yang menyusun komputer dengan antarmuka yang mendukung pemanggilan berantai.Class
ComputerBuilderkamu harus memiliki anggotaComputerprivate yang akan disusunnya. Implementasikan method berikut. Setiap method mengembalikan referensi ke builder agar method dapat dipanggil secara berantai:setCPU(const std::string& cpu)setRAM(const std::string& ram)setStorage(const std::string& storage)setGPU(const std::string& gpu)addWifi(): mengaktifkan kemampuan wifi
Implementasikan juga method
build()yang mengembalikan objectComputeryang telah selesai disusun dan mengatur ulang builder agar bisa digunakan kembali.main.cpp: Satukan semuanya untuk menyusun komputer khusus.Baca empat input:
- Model CPU (string)
- Spesifikasi RAM (string)
- Spesifikasi penyimpanan (string)
- Apakah akan menyertakan wifi:
yesatauno
Gunakan
ComputerBuilderuntuk menyusun komputer dengan CPU, RAM, dan penyimpanan yang diberikan. Jika input wifi adalahyes, panggil jugaaddWifi(). Perhatikan bahwa konfigurasi ini tidak menentukan GPU: builder harus menangani komponen opsional dengan baik.Setelah selesai menyusun, panggil
showSpecs()pada komputer yang dihasilkan untuk menampilkan konfigurasinya.
Method showSpecs() harus menghasilkan output dalam format berikut, hanya menampilkan komponen yang telah diatur:
CPU: [value]
RAM: [value]
Storage: [value]
GPU: [value]
Wifi: EnabledContohnya, dengan input Intel i7-12700K, 32GB DDR5, 1TB NVMe SSD, dan yes:
CPU: Intel i7-12700K
RAM: 32GB DDR5
Storage: 1TB NVMe SSD
Wifi: EnabledDengan input AMD Ryzen 5 5600X, 16GB DDR4, 512GB SSD, dan no:
CPU: AMD Ryzen 5 5600X
RAM: 16GB DDR4
Storage: 512GB SSDPerhatikan bahwa pola Builder membuat proses penyusunan mudah dibaca dan fleksibel. Kamu dapat dengan mudah menambahkan atau melewatkan komponen, dan pemanggilan method secara berantai menghasilkan kode yang jelas serta mendokumentasikan dirinya sendiri. Baris GPU tidak muncul karena kita tidak pernah mengaturnya. Ini menunjukkan bagaimana builder menangani komponen opsional secara alami.
Coba sendiri
#include <iostream>
#include <string>
#include "ComputerBuilder.h"
using namespace std;
int main() {
// Baca input
string cpu, ram, storage, wifiChoice;
getline(cin, cpu);
getline(cin, ram);
getline(cin, storage);
getline(cin, wifiChoice);
// TODO: Buat instance ComputerBuilder
// TODO: Gunakan method chaining untuk mengatur CPU, RAM, dan storage
// TODO: Jika wifiChoice bernilai "yes", panggil juga addWifi()
// TODO: Panggil build() untuk mendapatkan object Computer
// TODO: Panggil showSpecs() pada komputer yang sudah dibuat untuk menampilkan konfigurasi
return 0;
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Object
1Dasar-Dasar OOP
File EksternalBuild dan Kompilasi C++File Header dan File SourceNamespace dan CakupanPengantar OOP dalam C++class vs objectPointer 'this'method (Fungsi Anggota)Atribut (Anggota Data)Dasar Ctor dan DtorRingkasan: Kalkulator Sederhana4Properti class
Anggota instance vs staticGetter dan setterFungsi anggota constKata kunci mutableMethod dan variabel staticFungsi dan class friendRangkuman, Pengelola Rekening Bank7Pewarisan
Pewarisan DasarTingkat Akses pada PewarisanUrutan Pemanggilan Ctor & DtorPenimpaan methodFungsi Virtual & VTablePewarisan BergandaPewarisan VirtualRangkuman: Hierarki Karyawan10Gambaran Umum STL
Gambaran Umum dan Filosofi STLKontainer STLIteratorAlgoritma STLFunctor dan Ekspresi LambdaRangkuman: Frekuensi Kata13Pola Desain Bagian 1
Pengantar Pola DesainPola SingletonFactory dan Abstract FactoryPola BuilderPola ObserverPola Strategy2Manajemen Memori
Memori Stack vs HeapPointer dan ReferenceMemori Dinamis (new/delete)Smart Pointer di C++RAII di C++Rangkuman: Pengelola Array Dinamis5Enkapsulasi
Penentu Akses dalam C++Penentu Akses secara MendalamPenyembunyian Informasistruct vs classNested dan Inner classRangkuman, Sistem Catatan Siswa8Polimorfisme
Polimorfisme saat Compile vs RuntimeOverloading FungsiMeninjau Kembali Fungsi VirtualFungsi Virtual MurniKelas AbstrakDesain Interface di C++Casting Dinamis & RTTIRangkuman: Kalkulator Bentuk3Konstruktor & Destruktor
Konstruktor DefaultKonstruktor BerparameterKonstruktor SalinKonstruktor PindahDaftar Inisialisasi KonstruktorKonstruktor DelegasiKupas Tuntas DestruktorAturan Tiga, Lima, dan NolRangkuman: class String6Overloading Operator
Pengantar Overloading OperatorOverloading Operator AritmetikaOverloading Operator PerbandinganOperator StreamOverloading Operator PenugasanOverloading Operator [] dan ()Operator Konversi TipeRingkasan, class Matrix9Template
Template FungsiTemplate classSpesialisasi TemplateTemplate VariadikDasar SFINAE & Type TraitsRangkuman, Container GenerikLatihan sendiri: Compiler C++ online