Mode pembangun
Definisi juga disebut pola generator. Ini dapat abstrak proses konstruksi objek kompleks (kategori abstrak), sehingga metode implementasi yang berbeda dari proses abstrak ini dapat membangun objek dengan manifestasi yang berbeda (atribut).
Ketika algoritma untuk membuat objek yang kompleks harus tidak tergantung pada komponen objek itu, dan proses konstruksi harus memungkinkan objek yang dibangun memiliki representasi yang berbeda. Kami mungkin mempertimbangkan untuk menggunakan mode builder.
menyelesaikan
1. Builder menentukan antarmuka abstrak untuk setiap komponen yang membuat objek produk. Biasanya, berisi metode abstrak yang membuat dan mengembalikan produk, atau bisa menjadi metode konkret, menempatkan proses pembuatan ke dalam kelas ConcreteBuilder.
2. ConcreteBuilder mengimplementasikan antarmuka pembangun untuk membangun dan merakit berbagai komponen produk.
3. Direktur bertanggung jawab untuk memanggil pembangun yang sesuai untuk membentuk produk. Kelas Direktur umumnya tidak bergantung pada kelas produk. Kelas pembangun secara langsung berinteraksi dengan kelas sutradara.
4. Produk mewakili objek kompleks yang akan dibangun. CONCreateBuilder menciptakan representasi internal dari produk dan mendefinisikan proses perakitannya.
/ ** "Produk"*/ kelas pizza {private string dough = ""; Private String Sauce = ""; private string topping = ""; public void setDough (string adonan) {this.dough = dough; } public void setSauce (saus string) {this.sauce = saus; } public void settopping (string topping) {this.topping = topping; }} ''/** "abstrak builder"*/'' abstrak kelas pizzabuilder {pizza pizza yang dilindungi; pizza publik getPizza () {return pizza; } public void createNewPizzAproduct () {pizza = new pizza (); } public abstrak batal builddough (); public abstract void building (); public abstrak void buildtopping (); } / ** "ConcreteBuilder"* / kelas Hawaiianpizzabuilder memperluas pizzabuilder {public void builddough () {pizza.setDough ("cross"); } public void buildsauce () {pizza.setsauce ("ringan"); } public void buildtopping () {pizza.settopping ("ham+nanas"); }} / ** "concreetebuilder"* / class spicypizzabuilder memperluas pizzabuilder {public void builddough () {pizza.setDough ("pan panggang"); } public void buildsauce () {pizza.setauce ("hot"); } public void buildtopping () {pizza.settopping ("pepperoni+salami"); }} ''/** "sutradara"*/'' class waiter {private pizzabuilder pizzabuilder; public void setPizzabuilder (pizzabuilder pb) {pizzabuilder = pb; } pizza getPizza () {return pizzabuilder.getPizza (); } public void constructPizza () {pizzabuilder.createNewPizzaproduct (); pizzabuilder.builddough (); pizzabuilder.buildsauce (); pizzabuilder.buildtopping (); }} /** Pelanggan yang memesan pizza. */ class buildingExample {public static void main (string [] args) {waiter waiter = new waiter (); Pizzabuilder hawaiian_pizzabuilder = baru Hawaiianpizzabuilder (); Pizzabuilder spicy_pizzabuilder = spicypizzabuilder baru (); waiter.setpizzabuilder (Hawaiian_pizzabuilder); waiter.constructpizza (); Pizza pizza = waiter.getpizza (); }}Klien membuat objek Direktur dan mengonfigurasinya dengan objek pembangun yang diinginkannya. Direktur memperoleh permintaan pelanggan untuk membuat produk dan akhirnya mendapatkan produk.
keuntungan
1. Proses pembuatan objek dapat dikontrol dengan cermat untuk menghasilkan objek produk yang berbeda.
2. Mudah diperluas. Ketika ada produk baru, Anda bisa menambahkan ConcreteBuilder baru untuk mencapainya.
Pola Terkait Abstrak Pola pabrik mirip dengan generator karena juga dapat membuat objek yang kompleks. Perbedaan utama adalah bahwa pola generator berfokus pada membangun objek yang kompleks langkah demi langkah. Model pabrik abstrak berfokus pada beberapa seri objek produk (sederhana atau kompleks).
Generator mengembalikan produk pada langkah terakhir, dan untuk pabrik abstrak, produk segera kembali.
Mode prototipe
Mendefinisikan pola prototipe adalah jenis pola penciptaan, yang ditandai dengan "menyalin" instance yang ada untuk mengembalikan instance baru, daripada membuat instance baru. Contoh yang disalin adalah apa yang kita sebut "prototipe", yang dapat disesuaikan.
Mode prototipe sebagian besar digunakan untuk membuat instance yang kompleks atau memakan waktu, karena dalam hal ini, menyalin instance yang ada membuat program berjalan lebih efisien; atau membuat nilai yang sama, hanya menamai data serupa yang berbeda.
menyelesaikan
1. Klien - Buat objek baru dan kemudian dapatkan objek lain melalui klon.
2. Prototipe - Tentukan metode abstrak klon sendiri.
3. Concreteprototype - Menerapkan metode klon.
prototipe antarmuka publik {public abstrak objek clone (); } kelas publik concreteprototype mengimplementasikan prototipe {clone objek publik () {return super.clone (); }} kelas publik klien {public static void main (string arg []) {concreteprototype obj1 = concretePrototype baru (); Concreteprototype obj2 = concreteprototype) obj1.clone (); }} Contoh
1. Banyak elemen dalam permainan diulang, dan kami dapat menggunakan mode prototipe untuk menyalin elemen yang sama.
2. Saat membuat grafik data, pertama kali kita perlu membaca data dari database dan menyimpannya ke objek. Ketika kita perlu membuat grafik lain dari data yang sama, menggunakan mode prototipe dapat menghindari membaca ulang database.
Pertanyaan dan implementasi terkait
1. Jika jumlah prototipe yang akan dibuat tidak diperbaiki, Anda dapat membuat manajer prototipe. Sebelum menyalin objek prototipe, klien pertama -tama memeriksa apakah ada objek prototipe yang memenuhi persyaratan di Prototipe Manager. Jika ada, itu akan menggunakannya secara langsung. Jika tidak, klon satu. Ini disebut bentuk pendaftaran mode prototipe.
2. Ada dua jenis penyalinan: salinan dalam dan salinan dangkal. Saat menyalin, objek salin dan objek prototipe berbagi semua variabel internal objek, dan kedua objek memiliki ruang memori yang sama dan siklus hidup. Modifikasi objek prototipe juga memodifikasi replika dan sebaliknya.
Di Java, selama Anda mengimplementasikan antarmuka yang dapat dikloning, Anda dapat memanggil metode klon dari kelas objek untuk mencapai penyalinan yang dangkal:
Kelas Publik DeldowClone mengimplementasikan usia yang dapat dikloning {int; Orang; public void setage (int usia) {this.age = usia; } public void setPerson (nama string) {person = orang baru (nama); } objek publik clone () melempar clonenotsupportedException {// Java default mengimplementasikan salinan dangkal return super.clone (); }} Public Class Person {String Name; orang publik (nama string) {this.name = name; }} tes kelas publik {public static void main (string [] args) melempar clonenotsupportedException {dallowclone oldshallowclone = new dallowclone (); oldshallowclone.setage (20); oldshallowclone.setperson ("Eric"); System.out.println ("OldName:" + OldshallowClone.Person.name + "Umur:" + OldshallowClone.age); Dangkal newshallowclone = (dangkalclone) oldshallowclone.clone (); System.out.println ("NewName:" + NewshallowClone.Person.name + "Umur:" + NewshallowClone.Age); oldshallowclone.age = 30; oldshallowclone.person.name = "Frank"; System.out.println ("NewName:" + NewshallowClone.Person.name + "Umur:" + NewshallowClone.Age); }} Keluaran:
Oldname: Eric Umur: 20NewName: Eric Umur: 20NewName: Frank Umur: 20
Dapat dilihat bahwa penyalinan objek adalah referensi ke objek. Ketika nilai objek diubah, objek yang disalin juga akan berubah, dan tipe dasar Java adalah nilai yang disalin.
Di bawah ini kami mengimplementasikan salinan yang dalam:
Public Class DeepClone {int Age; Orang; public void setage (int usia) {this.age = usia; } public void setPerson (nama string) {person = orang baru (nama); } public DeepClone (DeepClone DeepClone) {this.age = DeepClone.age; this.person = orang baru (deepclone.person.name); } public DeepClone () {} Clone objek publik () melempar clonenotsupportedException {return new DeepClone (this); }} tes kelas publik {public static void main (string [] args) melempar clonenotsupportedException {deepclone oldDeepClone = new DeepClone (); Olddeepclone.setage (20); Olddeepclone.setperson ("Eric"); System.out.println ("OldName:" + Olddeepclone.Person.name + "Umur:" + Olddeepclone.age); Deepclone newdeepclone = (Deepclone) olddeepclone.clone (); System.out.println ("NewName:" + newDeepclone.person.name + "usia:" + newDeepclone.age); olddeepclone.age = 30; olddeepclone.person.name = "Frank"; System.out.println ("NewName:" + newDeepclone.person.name + "usia:" + newDeepclone.age); }} Keluaran:
Oldname: Eric Umur: 20NewName: Eric Umur: 20NewName: Eric Umur: 20
Dalam metode salinan di atas, kami menciptakan kembali objek dan menciptakan kembali referensi untuk mengimplementasikan salinan yang dalam.
keuntungan
1. Menyalin lebih baik dari yang baru.
2. Sederhanakan atau sembunyikan detail pembuatan objek dan salin secara langsung.