Java'nın çekirdek kütüphanelerindeki GoF Tasarım Kalıplarına örnekler


672

GoF Java Tasarım Desenlerini öğreniyorum ve bunlardan bazı gerçek yaşam örnekleri görmek istiyorum. Java'nın temel kütüphanelerindeki bu Tasarım Desenlerinin bazı iyi örnekleri nelerdir?

Yanıtlar:


3229

Wikipedia'da birçok tasarım desenine genel bir bakış bulabilirsiniz . Ayrıca, GoF tarafından hangi kalıplardan bahsedildiğinden bahsedilmektedir. Bunları burada toplayacağım ve hem Java SE hem de Java EE API'lerinde bulunan mümkün olduğunca çok desen uygulaması atamaya çalışacağım.


Yaratıcı desenler

Soyut fabrika (fabrikanın kendisini döndüren yaratıcı bir yöntemle tanınabilir, bu da başka bir soyut / arayüz tipi oluşturmak için kullanılabilir)

Oluşturucu (örneğin kendisini döndüren yaratıcı yöntemlerle tanınabilir)

Fabrika yöntemi (özet / arayüz türünün uygulanmasını döndüren yaratıcı yöntemlerle tanınabilir)

Prototip ( aynı özelliklere sahip farklı bir örneğini döndüren yaratıcı yöntemlerle tanınabilir )

Singleton ( her seferinde aynı örneği (genellikle kendi başına) döndüren yaratıcı yöntemlerle tanınabilir )


Yapısal desenler

Bağdaştırıcı ( farklı soyut / arabirim türünün bir örneğini alan ve verilen örneği süsleyen / geçersiz kılan kendi / başka bir özet / arabirim türünün bir uygulamasını döndüren yaratıcı yöntemlerle tanınabilir )

Köprü ( farklı soyut / arayüz türünün bir örneğini alan ve verilen örneği temsil eden / kullanan kendi soyut / arayüz türünün bir uygulamasını döndüren yaratıcı yöntemlerle tanınabilir )

  • Henüz hiçbiri akla gelmiyor. Kurgusal bir örnek new LinkedHashMap(LinkedHashSet<K>, List<V>), öğeleri klonlamayan, ancak bunları kullanan değiştirilemeyen bağlantılı bir harita döndürür . java.util.Collections#newSetFromMap()Ve singletonXXX()yöntemler ancak yakın geliyor.

Kompozit ( aynı soyut / arayüz tipi bir örneği bir ağaç yapısına alan davranışsal yöntemlerle tanınabilir )

Dekoratör ( ek davranış ekleyen aynı soyut / arayüz türünün bir örneğini alan yaratıcı yöntemlerle tanınabilir )

Cephe ( farklı bağımsız soyut / arayüz türlerinin örneklerini dahili olarak kullanan davranışsal yöntemlerle tanınabilir )

Flyweight (önbelleğe alınmış bir örnek, biraz "multiton" fikri döndüren yaratıcı yöntemlerle tanınabilir)

Vekil (dönüş verilen özet / arayüz tipi bir uygulama döner Yaratılışsal yöntemlerle recognizeable delege / kullanan bir başka belirli soyut / arayüz tipi uygulanmasını)


Davranış kalıpları

Sorumluluk zinciri ( bir sıradaki aynı soyut / arayüz türünün başka bir uygulamasında (dolaylı olarak) aynı yöntemi çağıran davranışsal yöntemlerle tanınabilir )

Komut ( oluşturma sırasında komut uygulaması tarafından kapsüllenen farklı bir soyut / arayüz türünün uygulanmasında bir yöntemi çağıran bir soyut / arayüz türündeki davranışsal yöntemler tarafından tanınabilir )

Yorumlayıcı ( belirli bir örnek / türün yapısal olarak farklı bir örneğini / türünü döndüren davranışsal yöntemlerle tanınabilir ; ayrıştırma / biçimlendirmenin modelin bir parçası olmadığını, deseni ve nasıl uygulanacağını unutmayın)

Yineleyici ( sıradan farklı türdeki örnekleri sırayla döndüren davranışsal yöntemlerle tanınabilir )

Arabulucu (verilen örneği temsil eden / kullanan farklı soyut / arabirim türünün (genellikle komut desenini kullanarak) bir örneğini alan davranışsal yöntemlerle tanınabilir)

Memento ( tüm örneğin durumunu dahili olarak değiştiren davranışsal yöntemlerle tanınabilir )

Gözlemci (veya Yayınla / Abone Ol) ( kendi durumuna bağlı olarak başka bir soyut / arabirim türünün örneğinde bir yöntem çağıran davranışsal yöntemlerle tanınabilir )

Durum (örneğin, harici olarak kontrol edilebilecek duruma bağlı olarak davranışını değiştiren davranışsal yöntemlerle tanınabilir)

Strateji ( strateji uygulamasına yöntem bağımsız değişkeni olarak aktarılan farklı bir özet / arayüz türünün uygulanmasında bir yöntemi çağıran bir soyut / arayüz türündeki davranışsal yöntemlerle tanınabilir )

Şablon yöntemi (bir soyut tür tarafından tanımlanmış "varsayılan" davranışı zaten olan davranışsal yöntemler tarafından tanınabilir)

Ziyaretçi (iki tarafından recognizeable farklı her alır tanımlanan yöntemleri bulunur Anahtar / arayüz türleri diğer Anahtar / arayüz tipi; biri aslında diğer yöntem ve diğer yürütür üzerinde arzu edilen bir strateji çağırır)


23
etkileyici .. :) +1. javax.lang.model.elementziyaretçileri tanımlar;) Pek emin olmadığını değilim doXXXve doFilter"stratejileri" dir.
Bozho

16
Bahsedilen kurucu maddeler, örneğin StrinbgBuilder, Oluşturucu Modeli için bir örnek değildir. Ancak onları inşaatçı olarak kabul etmek çok yaygın bir hatadır (bu yüzden gerçekten suçlu değilsiniz _ _ ^)
Angel O'Sphere

77
@BalusC, sana bir sorum olacak. Java ve JSF'nin WHOLE kaynak kodunu okudunuz mu?
Tapas Bose

20
@Tapas: Her şeyi okumadım, sadece ihtiyacım olan parçaları ya da sadece "nasıl" yaptıklarını merak ettim.
BalusC

7
"Fabrika Metodu" altındaki örneklerin çoğu, bir GoF kalıbı olmayan "statik fabrika" örneğidir. Doğru değil.
yüzük taşıyıcısı

107
  1. Tüm salınım boyunca gözlemci deseni ( Observable, Observer)
  2. MVC de hızlanıyor
  3. Adaptör desen: InputStreamReader ve OutputStreamWriter NOT: ContainerAdapter, ComponentAdapter, FocusAdapter, KeyAdapter, MouseAdaptervardır değil adaptörleri; bunlar aslında Boş Nesnelerdir. Sun'ın kötü adlandırma seçeneği.
  4. Dekoratör deseni ( BufferedInputStreamgibi diğer akışları süsleyebilir FilterInputStream)
  5. AWT Toolkit ve Swing takılabilir görünüm ve his sınıfları için Soyut Fabrika Deseni
  6. java.lang.Runtime#getRuntime() Singleton
  7. ButtonGroup Arabulucu deseni için
  8. Action, AbstractActionaynı kodu çalıştırmak için farklı görsel temsiller için kullanılabilir -> Komut deseni
  9. Flyweight Pattern için JTable'da Interned Strings veya CellRender (Ayrıca çeşitli havuzları da düşünün - İş parçacığı havuzları, bağlantı havuzları, EJB nesne havuzları - Flyweight gerçekten paylaşılan kaynakların yönetimi ile ilgilidir)
  10. Java 1.0 olay modeli, Servlet Filtreleri gibi bir Sorumluluk Zinciri örneğidir.
  11. Koleksiyonlar Çerçevesinde yineleyici deseni
  12. AWT / Swing'deki iç içe geçmiş kaplar Kompozit deseni kullanır
  13. AWT / Swing'deki Yerleşim Yöneticileri bir Strateji örneğidir

ve daha pek çoğu sanırım


1
MouseAdapter üzerindeki ipucu için teşekkürler. Bu açıklamayı buldum: stackoverflow.com/questions/9244185/…
Lincoln

Swing'in sadece MVC'ye göre gevşek olduğunu unutmayın . View ve Controller'ı bir sınıfa daralttı.
Matthias Braun

51
  1. Flyweight bazı Byte, Short, Integer, Long ve String değerleriyle kullanılır.
  2. Cephe birçok yerde kullanılır, ancak en belirgin olanı Scripting arabirimleridir.
  3. Singleton - java.lang.Runtime akla geliyor.
  4. Abstract Factory - Ayrıca Komut Dosyası ve JDBC API.
  5. Komut - TextComponent'in Geri Al / Yinele.
  6. Yorumlayıcı - RegEx (java.util.regex. ) Ve SQL (java.sql. ) API'sı.
  7. Prototip - Bu sayının% 100 olduğundan emin değilim, ama clone()bu amaç için thinkg yöntemi kullanılabilir.

1
İlgili Flyweight desen: Bu farklı Düzen Yöneticileri olabilir java.awtve java.swingpaketler. Aslında, neredeyse özdeş öznitelikleri paylaşırlar ve dış öznitelikler UI formunda düzenledikleri farklı UI bileşenleridir.
Vitaly

@NawaMan 5. Comand TextComponent'ın Geri Al / Yinele'yi söylediniz. Bence komuta etmek değil. Ya da büyük olasılıkla her ikisi de.
Stimpson Cat

Lütfen ilgili bir soruda bana yardımcı olabilir misiniz - stackoverflow.com/questions/61284856/… . Bu basit örnekte komut desenini kullandım, ancak sorunumu çözmenin doğru yolu olup olmadığından emin değilim.
Tom Joe

42

RMI, Proxy'yi temel alır.

GoF'deki 23 modelin çoğu için bir alıntı yapmak mümkün olmalıdır:

  1. Özet Fabrika: java.sql arabirimlerinin tümü, sürücü kaydedildiğinde JDBC JAR'dan somut uygulamalarını alır.
  2. Oluşturucu: java.lang.StringBuilder.
  3. Fabrika Metodu: XML fabrikaları, diğerleri arasında.
  4. Prototip: Belki clone (), ama bunu satın aldığımdan emin değilim.
  5. Singleton: java.lang.System
  6. Bağdaştırıcı: java.awt.event içindeki bağdaştırıcı sınıfları, örneğin WindowAdapter.
  7. Bridge: Java.util'deki toplama sınıfları. Liste ArrayList tarafından uygulandı.
  8. Kompozit: java.awt. java.awt.Component + java.awt.Container
  9. Dekoratör: Tüm java.io paketinin üzerinde.
  10. Cephe: ExternalContext , çerez, oturum kapsamı ve benzeri işlemleri gerçekleştirmek için bir cephe görevi görür.
  11. Flyweight: Tamsayı, Karakter, vb.
  12. Proxy: java.rmi paketi
  13. Sorumluluk Zinciri: Servlet filtreleri
  14. Komut: Menü öğelerini döndürme
  15. Tercüman: Doğrudan JDK'da değil, JavaCC bunu kesinlikle kullanıyor.
  16. Yineleyici: java.util.Iterator arabirimi; bundan daha net olamaz.
  17. Arabulucu: JMS?
  18. Memento:
  19. Gözlemci: java.util.Observer/Observable (kötü yapılmış olsa da)
  20. Durum:
  21. Strateji:
  22. Şablon:
  23. Ziyaretçi:

23'ten 10'u için Java'daki örnekleri düşünemiyorum, ama yarın daha iyisini yapıp yapamayacağımı göreceğim. Düzenleme bunun için.


28

Soyut Fabrika modeli çeşitli yerlerde kullanılmaktadır. Örneğin DatagramSocketImplFactory,, PreferencesFactory. Daha birçok --- --- kendi adlarında "Fabrika" kelimesi olan arayüzler için Javadoc arama.

Ayrıca Fabrika modelinin de birkaç örneği var.


22

Bununla bir tür kırık bir saat olmasına rağmen, Java XML API Factory'yi çok kullanıyor. Yani şuna bir bakın:

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

... ve benzerleri.

Ayrıca çeşitli Tamponlar (StringBuffer, ByteBuffer, StringBuilder) Builder'ı kullanır.


21

java.util.Collection # Iterator bir Fabrika Yöntemi'nin iyi bir örneğidir. Kullandığınız Koleksiyonun somut alt sınıfına bağlı olarak, bir Yineleyici uygulaması oluşturacaktır. Hem Fabrika üst sınıfı (Koleksiyon) hem de oluşturulan Yineleyici arabirimler olduğundan, bazen AbstractFactory ile karıştırılır. Kabul cevap (BalusC) 'de AbstractFactory için örneklerin çoğu örnekleridir Fabrikası , özgün GoF kalıplarının parçası değildir Fabrika Yöntemi, basitleştirilmiş sürümü. Facory'de Factory sınıfı hiyerarşisi çöker ve fabrika, iade edilecek ürünü seçmek için başka yöntemler kullanır.

  • Soyut Fabrika

Soyut bir fabrikada, her biri farklı bir ürün oluşturan birden fazla fabrika yöntemi vardır. Bir fabrika tarafından üretilen ürünlerin birlikte kullanılması amaçlanmıştır (yazıcınız ve kartuşlarınız aynı (soyut) fabrikadan alınmalıdır). Yukarıdaki yanıtlarda belirtildiği gibi, platformdan platforma farklılık gösteren AWT GUI bileşenlerinin aileleri bunun bir örneğidir (uygulaması Gof'ta açıklanan yapıdan farklı olsa da).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.