1 Ikhtisar
Pola Pembangun (Pola Pembangun) terutama digunakan untuk "membangun objek kompleks langkah demi langkah", di mana "langkah demi langkah" adalah algoritma yang stabil, sedangkan berbagai bagian dari objek kompleks sering berubah. Oleh karena itu, pola pembangun terutama digunakan untuk menyelesaikan perubahan persyaratan "bagian objek". Hal ini memungkinkan kontrol yang lebih halus atas proses konstruksi objek.
2 contoh
Mengambil contoh produksi ponsel, setiap ponsel dibagi menjadi Layar, CPU, dan Baterai. Kini ada dua jenis ponsel yang akan diproduksi, Apple dan Samsung.
apel:
Copy kode kodenya sebagai berikut:
paket org.scott.builder.before.use;
impor java.util.ArrayList;
impor java.util.List;
/**
* @penulis Scott
* @versi 20-11-2013
* @keterangan
*/
ApplePhone kelas publik {
Daftar<String> bagian = ArrayList<String>();
kekosongan publik createCPU() {
parts.add("PIALA: Qualcomm");
}
kekosongan publik buat Layar() {
parts.add("LAYAR: JDI");
}
kekosongan publik buatBaterai() {
parts.add("BATERAI: DeSai");
}
pertunjukan kekosongan publik(){
System.out.print("Informasi komponen produk:");
for(String bagian : bagian){
System.out.print(bagian + "/t");
}
}
}
Samsung:
Copy kode kodenya sebagai berikut:
paket org.scott.builder.before.use;
impor java.util.ArrayList;
impor java.util.List;
/**
* @penulis Scott
* @versi 20-11-2013
* @keterangan
*/
Ponsel Samsung kelas publik {
Daftar<String> bagian = ArrayList<String>();
kekosongan publik createCPU() {
parts.add("PIALA: MTK");
}
kekosongan publik buat Layar() {
parts.add("LAYAR: Samsung");
}
kekosongan publik buatBaterai() {
parts.add("BATERAI: DeSai");
}
pertunjukan kekosongan publik(){
System.out.print("Informasi komponen produk:");
for(String bagian : bagian){
System.out.print(bagian + "/t");
}
}
}
Klien uji:
Copy kode kodenya sebagai berikut:
paket org.scott.builder.before.use;
/**
* @penulis Scott
* @versi 20-11-2013
* @keterangan
*/
Tes Pembangun kelas publik {
ApplePhone statis pribadi iphone = ApplePhone baru();
SamsungPhone statis pribadi samPhone = SamsungPhone baru();
public static void main(String args[]){
iphone.createCPU();
iphone.createScreen();
iphone.createBattery();
iphone.tampilkan();
samPhone.createCPU();
samPhone.createScreen();
samPhone.createBattery();
samPhone.show();
}
}
Apakah Anda menemukan masalah? Artinya, setiap proses produksi ponsel itu sama. Tepatnya, nama prosesnya sama, namun proses spesifiknya berbeda-beda pemrosesan setiap perubahan proses, dari sini, kita dapat mengekstraksi yang tidak berubah, "tidak berubah untuk mengatasi semua perubahan", dan menyerahkan perubahan tersebut ke produk tertentu.
Bagaimana cara melakukannya secara spesifik? Kali ini mode Builder berguna.
Pertama, mari kita lihat antarmuka Telepon:
Copy kode kodenya sebagai berikut:
paket org.scott.builder.after.use;
impor java.util.ArrayList;
impor java.util.List;
/**
* @penulis Scott
* @versi 20-11-2013
* @keterangan
*/
kelas abstrak publik Telepon {
bagian Daftar<String> yang dilindungi = ArrayList<String>();
public void add(Bagian string){
bagian.tambahkan(bagian);
}
pertunjukan kekosongan publik(){
System.out.print("Informasi komponen produk:");
for(String bagian : bagian){
System.out.print(bagian + "/t");
}
}
}
Kategori ponsel Apple:
Copy kode kodenya sebagai berikut:
paket org.scott.builder.after.use;
/**
* @penulis Scott
* @versi 20-11-2013
* @keterangan
*/
ApplePhone kelas publik memperluas Telepon{
}
Kategori ponsel Samsung:
Copy kode kodenya sebagai berikut:
paket org.scott.builder.after.use;
/**
* @penulis Scott
* @versi 20-11-2013
* @keterangan
*/
SamsungPhone kelas publik memperluas Telepon{
}
Kemudian tentukan Pembuat antarmuka untuk langkah produksi:
Copy kode kodenya sebagai berikut:
paket org.scott.builder.after.use;
/**
* @penulis Scott
* @versi 20-11-2013
* @keterangan
*/
Pembuat antarmuka publik {
kekosongan publik buildCPU();
public void buildScreen();
public void buildBattery();
Telepon umum getPhone();
}
Pembuat untuk iPhone:
Copy kode kodenya sebagai berikut:
paket org.scott.builder.after.use;
/**
* @penulis Scott
* @versi 20-11-2013
* @keterangan
*/
kelas publik ApplePhoneBuilder mengimplementasikan Builder{
Telepon pribadi telepon = ApplePhone baru();
@Mengesampingkan
kekosongan publik buildCPU() {
phone.add("PIALA: Qualcomm");
}
@Mengesampingkan
public void buildScreen() {
telepon.tambahkan("LAYAR: JDI");
}
@Mengesampingkan
public void buildBattery() {
phone.add("BATERAI: DeSai");
}
@Mengesampingkan
Telepon umum getPhone() {
telepon kembali;
}
}
Pembuat untuk ponsel Samsung:
Copy kode kodenya sebagai berikut:
paket org.scott.builder.after.use;
/**
* @penulis Scott
* @versi 20-11-2013
* @keterangan
*/
kelas publik SamsungPhoneBuilder mengimplementasikan Builder{
telepon pribadi telepon = SamsungPhone baru();
@Mengesampingkan
kekosongan publik buildCPU() {
phone.add("PIALA: MTK");
}
@Mengesampingkan
public void buildScreen() {
telepon.tambahkan("LAYAR: Samsung");
}
@Mengesampingkan
public void buildBattery() {
phone.add("BATERAI: DeSai");
}
@Mengesampingkan
Telepon umum getPhone() {
telepon kembali;
}
}
Direktur yang memandu produksi spesifik ponsel:
Copy kode kodenya sebagai berikut:
paket org.scott.builder.after.use;
/**
* @penulis Scott
* @versi 20-11-2013
* @keterangan
*/
Direktur kelas publik {
pembangun swasta;
Direktur publik(Pembangun pembangun){
this.builder = pembangun;
}
konstruksi kekosongan publik(){
pembangun.buildCPU();
pembangun.buildScreen();
pembangun.buildBattery();
}
}
Akhirnya tulis kelas tes:
Copy kode kodenya sebagai berikut:
paket org.scott.builder.after.use;
/**
* @penulis Scott
* @versi 20-11-2013
* @keterangan
*/
Tes Pembangun kelas publik {
Pembuat statis pribadi iPhoneBuilder = new ApplePhoneBuilder();
Pembuat statis pribadi samPhoneBuilder = new SamsungPhoneBuilder();
public static void main(String[] args) {
Direktur direktur = Direktur baru(iPhoneBuilder);
direktur.konstruksi();
Telepon telepon = iPhoneBuilder.getPhone();
Sistem.keluar.println("iphone");
telepon.tampilkan();
direktur = Direktur baru(samPhoneBuilder);
direktur.konstruksi();
telepon = samPhoneBuilder.getPhone();
Sistem.keluar.println("/nsamSung");
telepon.tampilkan();
}
}
Hasil berjalan:
Copy kode kodenya sebagai berikut:
iPhone
Informasi Bagian Produk: CUP: Qualcomm LAYAR: BATERAI JDI: DeSai
samSung
Informasi Bagian Produk: CUP: MTK LAYAR: BATERAI Samsung: DeSai
Kedua kelas entitas Phone di sini kosong. Jika hal ini terjadi, maka keduanya dapat dihilangkan. Jika antarmuka Phone juga dapat dihilangkan, hanya kelas implementasi Director, Builder, dan Builder tertentu yang tersisa. Terlebih lagi, kelas ApplePhone dan kelas SamsungPhone adalah dua kelas yang terkait, keduanya merupakan merek ponsel yang berbeda. Jika Anda menjumpai dua atau lebih kelas yang tidak terlalu terkait, antarmuka Ponsel publik tidak perlu ada , Jadi bagaimana cara menentukan nilai kembalian metode getPhone() yang ditentukan di antarmuka Builder?
Terlepas dari apakah jenis nilai yang dikembalikan adalah ApplePhone atau SamsungPhone, masalah akan muncul karena jenis hasil yang dikembalikan tidak seragam. Saat ini, Telepon dapat didefinisikan sebagai antarmuka kosong (antarmuka yang tidak berisi metode apa pun), dan kemudian membiarkan kelas produk spesifik yang tidak memiliki hubungan satu sama lain mengimplementasikan antarmuka ini. Kemudian tipe nilai kembalian dari getPhone( ) metode yang ditentukan dalam antarmuka Builder Ini masih merupakan jenis Telepon, yang memecahkan masalah. Namun, dalam kasus ini, tidak perlu menggunakan mode Builder.