Saya baru-baru ini menghapus jawaban java saya di Tinjauan Kode , yang dimulai seperti ini:
private Person(PersonBuilder builder) {
Berhenti. Bendera merah. PersonBuilder akan membangun Seseorang; ia tahu tentang Seseorang. Kelas Person seharusnya tidak tahu apa-apa tentang PersonBuilder - ini hanya tipe yang tidak berubah. Anda telah membuat kopling bundar di sini, di mana A bergantung pada B yang tergantung pada A.
Orang tersebut harus memasukkan parameternya saja; seorang klien yang bersedia untuk menciptakan Orang tanpa membangunnya harus dapat melakukannya.
Saya ditampar dengan downvote, dan diberi tahu bahwa (mengutip) Bendera merah, mengapa? Implementasi di sini memiliki bentuk yang sama dengan yang diperlihatkan Joshua Bloch dalam bukunya "Java Efektif" (item # 2).
Jadi, tampaknya bahwa Satu Cara yang Benar dalam mengimplementasikan Pola Builder di Jawa adalah membuat builder menjadi tipe bersarang (ini bukan pertanyaan ini), dan kemudian membuat produk (kelas objek yang sedang dibangun ) mengambil ketergantungan pada pembangun , seperti ini:
private StreetMap(Builder builder) { // Required parameters origin = builder.origin; destination = builder.destination; // Optional parameters waterColor = builder.waterColor; landColor = builder.landColor; highTrafficColor = builder.highTrafficColor; mediumTrafficColor = builder.mediumTrafficColor; lowTrafficColor = builder.lowTrafficColor; }
Halaman Wikipedia yang sama untuk pola Builder yang sama memiliki implementasi yang sangat berbeda (dan jauh lebih fleksibel) untuk C #:
//Represents a product created by the builder public class Car { public Car() { } public int Wheels { get; set; } public string Colour { get; set; } }
Seperti yang Anda lihat, produk di sini tidak tahu apa-apa tentang suatu Builder
kelas, dan untuk semua yang peduli, itu bisa dipakai oleh panggilan konstruktor langsung, pabrik abstrak, ... atau pembangun - sejauh yang saya mengerti, produk dari pola kreasi tidak pernah perlu tahu apa pun tentang apa yang membuatnya.
Saya telah menerima argumen balasan (yang tampaknya secara eksplisit dipertahankan dalam buku Bloch) bahwa pola pembangun dapat digunakan untuk mengolah jenis yang akan membuat konstruktor penuh dengan puluhan argumen opsional. Jadi alih-alih berpegang pada apa yang saya pikir saya tahu saya sedikit meneliti di situs ini, dan menemukan bahwa seperti yang saya duga, argumen ini tidak menahan air .
Jadi, apa masalahnya? Mengapa mencari solusi over-engineered untuk masalah yang seharusnya tidak ada sejak awal? Jika kita mengambil Joshua Bloch dari tumpuannya selama satu menit, dapatkah kita menghasilkan satu alasan bagus dan sah untuk menggabungkan dua jenis beton dan menyebutnya sebagai praktik terbaik?
Ini semua berbau pemrograman kargo kepada saya.