1. Ikhtisar
Secara keseluruhan, pola desain dibagi menjadi tiga kategori:
(1) Mode Kreatif , Total Lima Jenis: Mode Metode Pabrik, Mode Pabrik Abstrak, Mode Singleton, Mode Pembangun, dan Mode Prototipe.
(2) Mode struktural , total tujuh jenis: mode adaptor, mode dekorator, mode proxy, mode penampilan, mode jembatan, mode kombinasi, dan mode kenikmatan.
(3) Mode perilaku , total sebelas: mode kebijakan, mode metode templat, mode pengamat, sub-mode iteratif, mode rantai tanggung jawab, mode perintah, mode memo, mode status, mode pengunjung, mode perantara, dan mode interpreter.
2. Enam Prinsip Model Desain
1. Buka Prinsip Tutup
Prinsip pembukaan dan penutupan adalah untuk membuka ke ekstensi dan mendekati modifikasi. Ketika program perlu diperluas, Anda tidak dapat memodifikasi kode asli untuk mencapai efek hot plug.
2. Prinsip Substitusi Liskov
Deskripsi resminya relatif abstrak dan dapat digunakan untuk Baidu. Faktanya, dapat dipahami sebagai berikut: (1) Kemampuan subkelas harus lebih besar dari atau sama dengan kelas induk, yaitu, metode yang dapat digunakan kelas induk, dan subclass dapat digunakan. (2) Hal yang sama berlaku untuk nilai pengembalian. Misalkan metode kelas induk mengembalikan daftar dan subkelas mengembalikan daftar array, yang tentu saja dapat dilakukan. Jika metode kelas induk mengembalikan daftar array dan kelas anak mengembalikan daftar, itu tidak masuk akal. Di sini kemampuan subkelas untuk mengembalikan nilai lebih kecil dari kelas orang tua. (3) Ada juga kasus di mana pengecualian dilemparkan. Metode subkelas apa pun dapat mendeklarasikan subkelas yang melempar metode kelas induk untuk menyatakan pengecualian.
Tidak dapat menyatakan bahwa pengecualian yang tidak dinyatakan oleh kelas induk adalah dilemparkan.
3. Prinsip inversi ketergantungan
Ini adalah dasar dari prinsip pembukaan dan penutupan, dan konten spesifik: pemrograman berorientasi antarmuka, mengandalkan abstraksi daripada konkret.
4. Prinsip Segregasi Antarmuka
Prinsip ini berarti: Menggunakan beberapa antarmuka terisolasi lebih baik daripada menggunakan antarmuka tunggal. Ini juga berarti mengurangi tingkat kopling antar kelas. Dari sini kita dapat melihat bahwa pola desain sebenarnya adalah ide desain perangkat lunak, mulai dari arsitektur perangkat lunak yang besar, untuk kenyamanan peningkatan dan pemeliharaan. Oleh karena itu, artikel di atas telah muncul berkali -kali: mengurangi ketergantungan dan mengurangi kopling.
5. Prinsip Demeter
Mengapa prinsip pengetahuan terkecil? Artinya, satu entitas harus berinteraksi dengan entitas lain sesedikit mungkin, sehingga modul fungsional sistem relatif independen.
6. Prinsip Penggunaan Komposit
Prinsipnya adalah mencoba menggunakan metode sintesis/agregasi daripada warisan.
3. Mode Pembuatan
Ada lima jenis mode pembuatan: mode metode pabrik, mode pabrik abstrak, mode singleton, mode pembangun, dan mode prototipe.
3.1. Model Metode Pabrik
Mode metode pabrik dibagi menjadi tiga jenis: mode pabrik biasa, beberapa mode metode pabrik dan mode metode pabrik statis.
3.1.1. Model pabrik biasa
Model pabrik biasa adalah untuk membangun kelas pabrik dan membuat contoh beberapa kelas yang menerapkan antarmuka yang sama.
paket com.mode.create; antarmuka publik myinterface {public void print ();} paket com.mode.create; kelas publik myclassone mengimplementasikan myinterface {@override public void print () {System.out.println ("myclassone"); }} paket com.mode.create; kelas publik myclasstwo mengimplementasikan myinterface {@Override public void print () {System.out.println ("myclasstwo"); }} paket com.mode.create; kelas publik myfactory {public myinterface produce (type string) {if ("one" .equals (type)) {return new myclassone (); } lain jika ("dua" .Equals (type)) {return baru myclasstwo (); } else {System.out.println ("Tidak ada tipe yang akan ditemukan"); kembali nol; }}} paket com.mode.create; Public Class FactoryTest {public static void main (string [] args) {myfactory factory = myfactory baru (); Myinterface myi = factory.produce ("one"); myi.print (); }}Saya pikir hasil FactoryTest harus jelas.
Mari kita pahami kalimat ini lagi: Model pabrik biasa adalah untuk membangun kelas pabrik dan membuat contoh beberapa kelas yang menerapkan antarmuka yang sama.
3.1.2. Beberapa mode metode pabrik
Mode metode pabrik berganda adalah peningkatan mode metode pabrik biasa. Mode Metode Pabrik Beberapa adalah untuk menyediakan beberapa metode pabrik untuk membuat objek secara terpisah.
Mari kita lihat kode secara langsung. Kami memodifikasi myFactory dan factorytest sebagai berikut:
paket com.mode.create; kelas publik myfactory {public myinterface produceOne () {return new myclassone (); } public myInterface productwo () {return baru myclasstwo (); }} paket com.mode.create; Public Class FactoryTest {public static void main (string [] args) {myfactory factory = myfactory baru (); Myinterface myi = factory.produceOne (); myi.print (); }}Hasil operasi juga sangat jelas.
Mari kita pahami kalimat ini lagi: beberapa mode metode pabrik adalah peningkatan untuk mode metode pabrik biasa. Mode Metode Pabrik Beberapa adalah untuk menyediakan beberapa metode pabrik untuk membuat objek secara terpisah.
3.1.3. Mode Metode Pabrik Statis
Mode Metode Pabrik Statis, Atur metode dalam beberapa mode metode pabrik di atas ke statis, dan tidak perlu membuat instance, sebut saja secara langsung.
Mari kita lihat kode secara langsung. Kami memodifikasi myFactory dan factorytest sebagai berikut:
paket com.mode.create; kelas publik myfactory {public static myinterface produceOne () {return new myclassone (); } public static myinterface productWo () {return new myclasstwo (); }} paket com.mode.create; Public Class FactoryTest {public static void main (string [] args) {myinterface myi = myfactory.produceOne (); myi.print (); }}Hasil operasi masih sangat jelas.
Tinjau Lagi: Mode Metode Pabrik Statis, Atur metode dalam mode metode pabrik multipel di atas ke statis, dan tidak perlu membuat instance, sebut saja secara langsung.
3.2. Pola pabrik abstrak
Ada masalah dengan model metode pabrik bahwa penciptaan kelas tergantung pada kelas pabrik, yaitu, jika Anda ingin memperluas program, Anda harus memodifikasi kelas pabrik, yang melanggar prinsip penutupan.
Untuk mengatasi masalah ini, mari kita lihat pola pabrik abstrak: buat beberapa kelas pabrik, sehingga setelah fungsi baru diperlukan, Anda dapat secara langsung menambahkan kelas pabrik baru, tanpa memodifikasi kode sebelumnya.
Ini sesuai dengan prinsip penutupan.
Mari kita lihat kode di bawah ini:
Myinterface, myclassone, myclasstwo tetap tidak berubah.
Antarmuka dan kelas berikut ditambahkan:
paket com.mode.create; penyedia antarmuka publik {public myinterface produce (); } paket com.mode.create; Public Class MyFactoryOne mengimplementasikan penyedia {@Override public myinterface produce () {return new myclasSone (); }} paket com.mode.create; kelas publik myfactorytwo mengimplementasikan penyedia {@override public myinterface produce () {return baru myclasstwo (); }}Ubah kelas uji FactoryTest sebagai berikut:
paket com.mode.create; Public Class FactoryTest {public static void main (string [] args) {penyedia penyedia = myfactoryOne baru (); Myinterface myi = provider.produce (); myi.print (); }}Hasil operasi masih jelas.
Tinjau lagi: Pola pabrik abstrak adalah membuat beberapa kelas pabrik, sehingga setelah fungsi baru diperlukan, Anda dapat secara langsung menambahkan kelas pabrik baru, tanpa memodifikasi kode sebelumnya.
3.3. Mode singleton
Pola singleton, tidak perlu terlalu banyak penjelasan.
Lihat saja kodenya:
tes paket; kelas publik myObject {private static myObject myObject; private myobject () {} public static myObject getInstance () {if (myObject! = null) {} else {myObject = new myobject (); } return myObject; }}Namun, ini akan menyebabkan masalah multi-threading. Untuk penjelasan terperinci, Anda dapat melihat Bab 6 dalam buku "Teknologi Inti dari Pemrograman Multi-Threading Java".
3.4. Mode pembangun
Pola pembangun: adalah untuk memisahkan konstruksi objek yang kompleks dari representasinya, sehingga proses konstruksi yang sama dapat membuat representasi yang berbeda.
Ini terlihat sangat abstrak secara harfiah, tetapi sebenarnya itu juga sangat abstrak! Lai Lai Lai
Mode pembangun biasanya mencakup karakter berikut:
(1) Pembangun: Berikan antarmuka abstrak untuk membakukan konstruksi berbagai komponen objek produk. Antarmuka ini menentukan bagian mana dari objek kompleks yang dibuat, dan tidak melibatkan pembuatan komponen objek tertentu.
(2) ConcreteBuilder: mengimplementasikan antarmuka pembangun, dan mendefinisikan penciptaan berbagai bagian objek kompleks untuk logika bisnis yang berbeda. Setelah proses konstruksi selesai, contoh produk disediakan.
(3) Direktur: Panggilan pembangun khusus untuk membuat berbagai bagian objek kompleks. Instruktur tidak melibatkan informasi produk tertentu, tetapi hanya bertanggung jawab untuk memastikan bahwa semua bagian objek dibuat utuh atau dalam urutan tertentu.
(4) Produk: Objek kompleks yang akan dibuat.
Adalah umum untuk membangun penjahat dalam pengembangan game, dan persyaratannya adalah: penjahat harus mencakup kepala, tubuh dan kaki.
Mari kita lihat kode berikut:
Produk (objek kompleks yang akan dibuat.):
paket com.mode.create; orang kelas publik {private string head; tubuh string pribadi; kaki string pribadi; public string gethead () {return head; } public void sethead (string head) {this.head = head; } public string getBody () {return body; } public void setBody (string body) {this.body = body; } public string getFoot () {return foot; } public void setFoot (string foot) {this.foot = foot; }} Pembangun (memberikan antarmuka abstrak untuk membakukan konstruksi berbagai komponen objek produk. Antarmuka ini menentukan bagian mana dari objek kompleks yang dibuat untuk diimplementasikan, dan tidak melibatkan pembuatan komponen objek tertentu.)::
paket com.mode.create; antarmuka publik personbuilder {void buildhead (); void buildbody (); batal buildfoot (); Orang buildperson ();} ConcreteBuilder (mengimplementasikan antarmuka pembangun, yang mewujudkan penciptaan berbagai bagian objek kompleks untuk logika bisnis yang berbeda. Setelah proses konstruksi selesai, berikan contoh produk.):
paket com.mode.create; Manbuilder kelas publik mengimplementasikan personbuilder {orang orang; public manbuilder () {person = orang baru (); } public void buildbody () {person.setBody ("Build the Man's Body"); } public void buildfoot () {person.setfoot ("Bangun kaki pria"); } public void buildhead () {person.sethead ("Bangun kepala pria"); } Publik BuildPerson () {Return Person; }} Direktur (hubungi pembangun spesifik untuk membuat berbagai bagian objek kompleks. Instruktur tidak melibatkan informasi produk tertentu. Ini hanya bertanggung jawab untuk memastikan bahwa bagian -bagian objek dibuat utuh atau dalam urutan tertentu.):
paket com.mode.create; Persondirector kelas publik {orang publik Constructperson (PersonBuilder PB) {pb.buildhead (); pb.buildbody (); pb.buildfoot (); return pb.buildperson (); }} Kelas Tes:
paket com.mode.create; tes kelas publik {public static void main (string [] args) {persondirector PD = new persondirector (); Orang orang = PD.Constructperson (new manbuilder ()); System.out.println (person.getBody ()); System.out.println (person.getFoot ()); System.out.println (person.gethead ()); }}Hasil Menjalankan:
Ulasan: Pola Pembangun: Adalah untuk memisahkan konstruksi objek yang kompleks dari representasinya, sehingga proses konstruksi yang sama dapat membuat representasi yang berbeda.
3.5. Mode prototipe
Gagasan dari pola ini adalah menggunakan objek sebagai prototipe, menyalin dan mengkloningnya, dan menghasilkan objek baru yang mirip dengan objek asli.
Berbicara tentang menyalin objek, saya akan membicarakannya dalam kombinasi dengan penyalinan dangkal dan penyalinan objek yang mendalam. Pertama -tama, Anda perlu memahami konsep penyalinan objek yang dalam dan dangkal:
Salinan dangkal: Setelah menyalin objek, variabel tipe data dasar akan diciptakan kembali, sedangkan tipe referensi menunjuk ke objek asli.
Salinan DEEP: Setelah menyalin objek, baik tipe data dasar dan jenis referensi diciptakan kembali. Sederhananya, penyalinan yang dalam sepenuhnya disalin, sementara penyalinan dangkal tidak menyeluruh.
Tulis contoh kedalaman penyalinan:
paket com.mode.create; Impor java.io.bytearrayInputStream; import java.io.bytearrayoutputstream; import java.io.ioException; import java.io.objectInputstream; import java.io.objectoutputstream; import java.io.serializable; prototipe kelas publik mengimplementasikan kloning, serializable {private static final long serialVersionuid = 1l; basis int pribadi; bilangan bulat pribadi obj; /* shallow copy*/ public Object clone() throws CloneNotSupportedException { // Because the Cloneable interface is an empty interface, you can define the method name of the implementation class at will // such as cloneA or cloneB, because the focus here is the sentence super.clone() // super.clone() calls the Object clone() method // In the Object class, clone() is a native (native method) Prototipe proto = (prototipe) super.clone (); mengembalikan proto; } /* Salin dalam* / objek publik DeepClone () melempar ioException, ClassNotFoundException { /* Tulis aliran biner ke objek saat ini* / bytearrayoutputStream bos = bytearrayoutputStream (); ObjectOutputStream OOS = ObjectOutputStream baru (BOS); oos.writeObject (ini); /* Baca objek baru yang dihasilkan oleh aliran biner*/ bytearrayInputStream bis = bytearrayinputStream baru (bos.tobytearray ()); ObjectInputStream OIS = ObjectInputStream baru (BIS); return ois.readObject (); } public int getBase () {return base; } public void setBase (int basis) {this.base = base; } public integer getobj () {return obj; } public void setobj (integer obj) {this.obj = obj; }} Kelas Tes:
paket com.mode.create; impor java.io.ioException; tes kelas publik {public static void main (string [] args) melempar clonenotsupportedException, classnotfoundException, ioException {prototipe prototipe = prototipe baru (); prototipe.setBase (1); prototipe.setobj (bilangan bulat baru (2)); /* salin dangkal*/ prototipe prototipe1 = (prototipe) prototipe.clone (); /* Copy deep*/ prototipe prototipe2 = (prototipe) prototipe.deepclone (); System.out.println (prototipe1.getObj () == prototipe1.getobj ()); System.out.println (prototipe1.getObj () == prototipe2.getobj ()); }}Hasil Menjalankan:
Di atas adalah semua tentang artikel ini, saya harap ini akan membantu untuk pembelajaran semua orang.