Contoh Pola Desain GoF di perpustakaan inti Jawa

672

Saya belajar Pola Desain Java GoF dan saya ingin melihat beberapa contoh nyata dari mereka. Apa saja contoh bagus dari Pola Desain ini di pustaka inti Java?

unj2
sumber

Jawaban:

3229

Anda dapat menemukan ikhtisar dari banyak pola desain di Wikipedia . Itu juga menyebutkan pola mana yang disebutkan oleh GoF. Saya akan meringkasnya di sini dan mencoba untuk menetapkan implementasi pola sebanyak mungkin, ditemukan di Java SE dan Java EE APIs.


Pola penciptaan

Pabrik abstrak (dapat dikenali dengan metode kreatif mengembalikan pabrik itu sendiri yang pada gilirannya dapat digunakan untuk membuat jenis abstrak / antarmuka lain)

Builder (dapat dikenali dengan metode kreatif yang mengembalikan instance itu sendiri)

Metode pabrik (dapat dikenali dengan metode kreatif yang mengembalikan implementasi tipe abstrak / antarmuka)

Prototipe (dapat dikenali melalui metode kreasi yang mengembalikan instance berbeda dengan properti yang sama)

Singleton (dapat dikenali dengan metode kreatif yang mengembalikan contoh yang sama (biasanya dengan sendirinya) setiap kali)


Pola struktural

Adaptor (dikenali dengan metode kreasi mengambil instance dari tipe abstrak / antarmuka yang berbeda dan mengembalikan implementasi sendiri / tipe abstrak / antarmuka lain yang menghiasi / mengabaikan contoh yang diberikan)

Bridge (dapat dikenali dengan metode kreasi yang mengambil instance dari tipe abstrak / antarmuka yang berbeda dan mengembalikan implementasi tipe abstrak / antarmuka sendiri yang mendelegasikan / menggunakan instance yang diberikan)

  • Belum ada yang terlintas dalam pikiran. Contoh fiktif adalah new LinkedHashMap(LinkedHashSet<K>, List<V>)mengembalikan peta tertaut yang tidak dapat dimodifikasi yang tidak mengkloning item, tetapi menggunakannya . Namun java.util.Collections#newSetFromMap()dan singletonXXX()metode mendekati.

Komposit (dapat dikenali dengan metode perilaku mengambil instance dari tipe abstrak / antarmuka yang sama ke dalam struktur pohon)

Dekorator (recognizeable dengan metode penciptaan mengambil contoh yang sama jenis abstrak / interface yang menambahkan perilaku tambahan)

Fasad (dapat dikenali dengan metode perilaku yang secara internal menggunakan instance dari tipe abstrak / antarmuka independen yang berbeda )

Bobot Terbang (dapat dikenali dengan metode kreatif yang mengembalikan contoh yang di-cache, sedikit gagasan "multiton")

Proxy (recognizeable dengan metode penciptaan yang mengembalikan sebuah implementasi diberikan jenis / abstrak antarmuka yang pada gilirannya delegasi / menggunakan sebuah berbeda pelaksanaan diberikan jenis abstrak / interface)


Pola perilaku

Rantai tanggung jawab (dapat dikenali oleh metode perilaku yang (secara tidak langsung) memanggil metode yang sama dalam implementasi lain dari tipe abstrak / antarmuka yang sama dalam antrian)

Command (dapat dikenali oleh metode perilaku dalam tipe abstrak / antarmuka yang memanggil metode dalam implementasi tipe abstrak / antarmuka berbeda yang telah dienkapsulasi oleh implementasi perintah selama pembuatannya)

Penerjemah (dapat dikenali dengan metode perilaku mengembalikan contoh / jenis yang berbeda secara struktural dari contoh / jenis yang diberikan; perhatikan bahwa parsing / pemformatan bukan bagian dari pola, menentukan pola dan cara menerapkannya)

Iterator (dapat dikenali dengan metode perilaku secara berurutan mengembalikan instance dari tipe yang berbeda dari antrian)

Mediator (dapat dikenali dengan metode perilaku mengambil instance dari tipe abstrak / antarmuka yang berbeda (biasanya menggunakan pola perintah) yang mendelegasikan / menggunakan instance yang diberikan)

Memento (dapat dikenali dengan metode perilaku yang secara internal mengubah keadaan seluruh instance)

Observer (atau Publish / Subscribe) (recognizeable dengan metode perilaku yang memanggil metode pada sebuah instance dari lain jenis / antarmuka abstrak, tergantung pada negara sendiri)

Negara (recognizeable dengan metode perilaku yang mengubah perilakunya tergantung pada negara contoh ini yang dapat dikendalikan secara eksternal)

Strategi (dapat dikenali dengan metode perilaku dalam tipe abstrak / antarmuka yang memanggil metode dalam implementasi tipe abstrak / antarmuka yang berbeda yang telah diteruskan sebagai argumen metode ke dalam implementasi strategi)

Metode template (dapat dikenali oleh metode perilaku yang sudah memiliki perilaku "default" yang didefinisikan oleh tipe abstrak)

Pengunjung (recognizeable oleh dua berbeda jenis antarmuka / abstrak yang memiliki metode yang didefinisikan yang mengambil masing-masing lain jenis / abstrak antarmuka; salah satu benar-benar memanggil metode yang lain dan mengeksekusi lainnya strategi yang diinginkan di atasnya)

BalusC
sumber
23
mengesankan .. :) +1. javax.lang.model.elementmendefinisikan pengunjung;) Saya tidak yakin apakah doXXXdan doFilter"strategi".
Bozho
16
Pembangun yang disebutkan misalnya StrinbgBuilder semua bukan contoh untuk Builder-Pattern. Namun, ini adalah kesalahan yang sangat umum untuk menganggap mereka sebagai pembangun (jadi Anda tidak perlu menyalahkan ^ _ ^)
Angel O'Sphere
77
@ BalusC, saya punya pertanyaan untuk bertanya kepada Anda. Apakah Anda membaca kode sumber SELURUH Jawa dan JSF?
Tapas Bose
20
@ Tapas: Saya tidak membaca semuanya, hanya bagian-bagian yang saya perlukan, atau hanya ingin tahu bagaimana "mereka" melakukannya.
BalusC
7
Sebagian besar contoh di bawah "Metode Pabrik" adalah contoh "pabrik statis" yang bukan merupakan pola GoF. Tidak benar.
pembawa cincin
107
  1. Pola pengamat di seluruh ayunan ( Observable, Observer)
  2. MVC juga berayun
  3. Pola Adapter: InputStreamReader dan OutputStreamWriter CATATAN: ContainerAdapter, ComponentAdapter, FocusAdapter, KeyAdapter, MouseAdapteryang tidak adapter; mereka sebenarnya Null Objects. Pilihan penamaan yang buruk oleh Sun.
  4. Pola dekorator ( BufferedInputStreamdapat menghias aliran lain seperti FilterInputStream)
  5. AbstractFactory Pattern untuk AWT Toolkit dan kelas swing-and-feel pluggable Swing
  6. java.lang.Runtime#getRuntime() adalah Singleton
  7. ButtonGroup untuk pola Mediator
  8. Action, AbstractAction dapat digunakan untuk representasi visual yang berbeda untuk mengeksekusi kode yang sama -> pola perintah
  9. Interned Strings atau CellRender di JTable untuk Pola Bobot Terbang (Juga pikirkan tentang berbagai kelompok - kelompok benang, kelompok koneksi, kelompok objek EJB - Kelompok Bobot sebenarnya tentang pengelolaan sumber daya bersama)
  10. Model acara Java 1.0 adalah contoh Rantai Tanggung Jawab, seperti juga Filter Servlet.
  11. Pola Iterator dalam Kerangka Koleksi
  12. Kontainer bersarang di AWT / Swing menggunakan pola Komposit
  13. Manajer Tata Letak di AWT / Swing adalah contoh Strategi

dan masih banyak lagi kurasa

jitter
sumber
1
Terima kasih atas tipnya pada MouseAdapter. Saya menemukan exaplanation ini: stackoverflow.com/questions/9244185/…
Lincoln
Perhatikan bahwa Swing hanya berdasarkan pada MVC. Ini telah menciutkan View dan Controller menjadi satu kelas.
Matthias Braun
51
  1. Flyweight digunakan dengan beberapa nilai Byte, Short, Integer, Long dan String.
  2. Fasad digunakan di banyak tempat tetapi yang paling jelas adalah antarmuka Scripting.
  3. Singleton - java.lang.Runtime muncul di pikiran.
  4. Pabrik Abstrak - Juga Scripting dan JDBC API.
  5. Command - Undo / Redo TextComponent.
  6. Juru Bahasa - RegEx (java.util.regex. ) Dan SQL (java.sql. ) API.
  7. Prototipe - Tidak 100% yakin jika ini dihitung, tapi saya pikir clone()metode ini dapat digunakan untuk tujuan ini.
NawaMan
sumber
1
Mengenai pola kelas terbang : bisa jadi berbeda dengan Manajer Tata Letak java.awtdan java.swingpaket. Memang, mereka berbagi atribut intrinsik yang hampir identik dan atribut ekstrinsik adalah komponen UI yang berbeda yang mereka tata dalam bentuk UI.
Vitaly
@NawaMan Anda berkata 5. Perintah Undo / Redo TextComponent. Saya pikir itu bukan kenang-kenangan perintah. Atau mungkin keduanya.
Stimpson Cat
Bisakah Anda membantu saya dalam pertanyaan terkait - stackoverflow.com/questions/61284856/… . Saya menggunakan pola perintah dalam contoh sederhana ini, tetapi saya tidak yakin apakah itu cara yang tepat untuk menyelesaikan masalah saya.
Tom Joe
42

RMI didasarkan pada Proksi.

Seharusnya dimungkinkan untuk mengutip satu untuk sebagian besar dari 23 pola di GoF:

  1. Abstrak Pabrik: antarmuka java.sql semua mendapatkan implementasi konkret dari JDBC JAR ketika driver terdaftar.
  2. Builder: java.lang.StringBuilder.
  3. Metode Pabrik: pabrik XML, antara lain.
  4. Prototipe: Mungkin klon (), tapi saya tidak yakin saya membelinya.
  5. Singleton: java.lang.System
  6. Adaptor: Kelas adaptor di java.awt.event, misalnya, WindowAdapter.
  7. Jembatan: Kelas koleksi di java.util. Daftar diimplementasikan oleh ArrayList.
  8. Komposit: java.awt. java.awt.Component + java.awt.Container
  9. Dekorator: Seluruh paket java.io.
  10. Fasad: ExternalContext berperilaku sebagai fasad untuk melakukan cookie, ruang lingkup sesi dan operasi serupa.
  11. Kelas Terbang: Integer, Karakter, dll.
  12. Proxy: paket java.rmi
  13. Rantai Tanggung Jawab: Servlet filter
  14. Perintah: Ayun item menu
  15. Penerjemah: Tidak secara langsung di JDK, tetapi JavaCC pasti menggunakan ini.
  16. Iterator: antarmuka java.util.Iterator; tidak bisa lebih jelas dari itu.
  17. Mediator: JMS?
  18. Memento:
  19. Pengamat: java.util.Observer/Observable (meskipun dilakukan dengan buruk)
  20. Negara:
  21. Strategi:
  22. Templat:
  23. Pengunjung:

Saya tidak bisa memikirkan contoh di Jawa selama 10 dari 23, tetapi saya akan melihat apakah saya bisa melakukan yang lebih baik besok. Untuk itulah sunting.

duffymo
sumber
28

Pola Pabrik Abstrak digunakan di berbagai tempat. Misalnya, DatagramSocketImplFactory, PreferencesFactory. Ada banyak lagi --- cari Javadoc untuk antarmuka yang memiliki kata "Pabrik" dalam nama mereka.

Juga ada beberapa contoh pola Pabrik juga.

uckelman
sumber
22

Meskipun saya semacam jam yang rusak dengan ini, Java XML API banyak menggunakan Factory. Maksud saya lihat saja ini:

Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(source);
String title = XPathFactory.newInstance().newXPath().evaluate("//title", doc);

... dan seterusnya dan seterusnya.

Selain itu berbagai Buffer (StringBuffer, ByteBuffer, StringBuilder) menggunakan Builder.

Esko
sumber
21

java.util.Collection # Iterator adalah contoh yang baik dari Metode Pabrik. Bergantung pada subkelas beton Koleksi yang Anda gunakan, itu akan membuat implementasi Iterator. Karena baik superclass Pabrik (Koleksi) dan Iterator yang dibuat adalah antarmuka, kadang-kadang bingung dengan AbstractFactory. Sebagian besar contoh untuk AbstractFactory dalam jawaban yang diterima (BalusC) adalah contoh Factory , versi yang disederhanakan dari Metode Pabrik, yang bukan bagian dari pola GoF asli. Dalam Facory the hierarki kelas Pabrik runtuh dan pabrik menggunakan cara lain untuk memilih produk yang akan dikembalikan.

  • Pabrik Abstrak

Pabrik abstrak memiliki banyak metode pabrik, masing-masing menciptakan produk yang berbeda. Produk yang dihasilkan oleh satu pabrik dimaksudkan untuk digunakan bersama (printer dan kartrid Anda sebaiknya dari pabrik yang sama (abstrak)). Seperti disebutkan dalam jawaban di atas keluarga komponen AWT GUI, berbeda dari platform ke platform, adalah contohnya (walaupun implementasinya berbeda dari struktur yang dijelaskan dalam Gof).

rev Catweazle
sumber