java - জাভা এর মূল লাইব্রেরিগুলিতে GoF ডিজাইন প্যাটার্নগুলির উদাহরণ
oop design-patterns (5)
আমি GoF জাভা ডিজাইন প্যাটার্নস শিখছি এবং আমি তাদের কিছু বাস্তব জীবন উদাহরণ দেখতে চাই। জাভা এর মূল লাইব্রেরিগুলিতে এই ডিজাইন প্যাটার্নগুলির কিছু ভাল উদাহরণ কি?
- পুরো সুইং পর্যবেক্ষক প্যাটার্ন (
Observable
,Observer
) - সুইং মধ্যে MVC এছাড়াও
- অ্যাডাপ্টারের প্যাটার্ন: ইনপুটস্ট্রিম রিডার এবং আউটপুট স্ট্রীম ওয়েটার উল্লেখ্য:
ContainerAdapter
অ্যাডাপ্টার,ComponentAdapter
অ্যাডাপ্টার,MouseAdapter
অ্যাডাপ্টার,MouseAdapter
অ্যাডাপ্টার,MouseAdapter
অ্যাডাপ্টার অ্যাডাপ্টার নয় ; তারা আসলে নিল বস্তু। সূর্য দ্বারা পছন্দের নামকরণ পছন্দ। - সজ্জা প্যাটার্ন (
BufferedInputStream
FilterInputStream
স্ট্রীম হিসাবে অন্যান্য স্ট্রিমগুলি সাজাইয়া রাখতে পারে) - AWT টুলকিট এবং সুইং প্লাগযোগ্য চেহারা এবং অনুভূতি ক্লাসের জন্য AbstractFactory প্যাটার্ন
-
java.lang.Runtime#getRuntime()
সিঙ্গলটন - Mediator প্যাটার্ন জন্য
ButtonGroup
-
Action
, এবসট্রাকশনটি একই কোডটি চালানোর জন্য বিভিন্ন চাক্ষুষ উপস্থাপনাগুলির জন্য ব্যবহার করা যেতে পারে -> কমান্ড প্যাটার্ন - ফ্লাইটওয়েট প্যাটার্নের জন্য জেটিএলে অভ্যন্তরীণ স্ট্রিং বা সেল রেন্ডার (বিভিন্ন পুল সম্পর্কেও চিন্তা করুন - থ্রেড পুল, সংযোগ পুল, ইজেবি অবজেক্ট পুল - ফ্লাইওয়েট সত্যিই ভাগ করা সংস্থানগুলির পরিচালনা সম্পর্কে)
- জাভা 1.0 ইভেন্ট মডেল হল সার্লেট ফিল্টারের মতো দায়িত্বের চেইন।
- সংগ্রহ ফ্রেমওয়ার্ক মধ্যে পরিমাপক প্যাটার্ন
- AWT / সুইং মধ্যে Nested পাত্রে কম্পোজিট প্যাটার্ন ব্যবহার
- AWT / সুইং মধ্যে লেআউট ম্যানেজার কৌশল একটি উদাহরণ
এবং আমি আরো অনেক অনুমান
- ফ্লাইটওয়েট বাইট, শর্ট, ইন্টিগ্রার, লং এবং স্ট্রিং এর কিছু মানগুলির সাথে ব্যবহার করা হয়।
- Facade অনেক জায়গায় ব্যবহৃত হয় কিন্তু সবচেয়ে স্পষ্ট স্ক্রিপ্টিং ইন্টারফেস হয়।
- সিঙ্গলটন - java.lang.Runtime মনে আসে।
- বিমূর্ত কারখানা - এছাড়াও স্ক্রিপ্টিং এবং JDBC API।
- কমান্ড - টেক্সট কম্পোনেন্ট এর পূর্বাবস্থায় ফেরানো / পুনরায় করুন।
- ইন্টারপ্রেটার - রেজিএক্স (java.util.regex। ) এবং এসকিউএল (java.sql। ) API।
- প্রোটোটাইপ - এই গণনাটি 100% নিশ্চিত না হলেও আমি মনে করি
clone()
পদ্ধতিটি এই উদ্দেশ্যে ব্যবহার করা যেতে পারে।
আপনি Wikipedia নকশা নকশার একটি সংক্ষিপ্ত বিবরণ খুঁজে পেতে পারেন। এটিও উল্লেখ করে যে কোনও নিদর্শনটি গোফ দ্বারা উল্লেখ করা হয়েছে। আমি এখানে তাদের যোগ করব এবং যতটা সম্ভব জাভা এস এবং জাভা ইই API এ পাওয়া যতটা সম্ভব প্যাটার্ন বাস্তবায়ন নির্ধারণ করার চেষ্টা করি।
ক্রিয়েশন নিদর্শন
বিমূর্ত কারখানা (সৃষ্টিকর্তা পদ্ধতিগুলি স্বীকৃত কারখানাটিকে নিজেই ফেরত দেয় যা আবার অন্য বিমূর্ত / ইন্টারফেস টাইপ তৈরি করতে ব্যবহার করা যেতে পারে)
javax.xml.parsers.DocumentBuilderFactory#newInstance()
-
javax.xml.transform.TransformerFactory#newInstance()
-
javax.xml.xpath.XPathFactory#newInstance()
Builder (সৃষ্টিকর্তা পদ্ধতি দ্বারা স্বীকৃতিপ্রাপ্ত দৃষ্টান্ত নিজেই ফিরে)
-
java.lang.StringBuilder#append()
(আনলিঙ্ক্রোনাইজড) -
java.lang.StringBuffer#append()
(সিঙ্ক্রোনাইজড) -
java.nio.ByteBuffer#put()
(CharBuffer
,ShortBuffer
,IntBuffer
,LongBuffer
,DoubleBuffer
এবংDoubleBuffer
) -
javax.swing.GroupLayout.Group#addComponent()
-
java.lang.Appendable
সব বাস্তবায়ন -
java.util.stream.Stream.Builder
ফ্যাক্টরী পদ্ধতি ( ক্রমাগত পদ্ধতির দ্বারা স্বীকৃত একটি বিমূর্ত / ইন্টারফেস টাইপ বাস্তবায়ন ফিরে)
-
java.util.Calendar#getInstance()
-
java.util.ResourceBundle#getBundle()
-
java.text.NumberFormat#getInstance()
-
java.nio.charset.Charset#forName()
-
java.net.URLStreamHandlerFactory#createURLStreamHandler(String)
(প্রতি প্রোটোকল প্রতিjava.net.URLStreamHandlerFactory#createURLStreamHandler(String)
বস্তু প্রদান করে) -
java.util.EnumSet#of()
-
javax.xml.bind.JAXBContext#createMarshaller()
এবং অন্যান্য অনুরূপ পদ্ধতি
Prototype ( Prototype পদ্ধতিগুলির দ্বারা স্বীকৃত যা একই বৈশিষ্ট্যগুলির সাথে নিজের একটি পৃথক উদাহরণ প্রদান করে)
-
java.lang.Object#clone()
(ক্লাসটিjava.lang.Cloneable
প্রয়োগ করতে হবে।java.lang.Cloneable
)
Singleton (সৃষ্টিকর্তা পদ্ধতিগুলি দ্বারা একই দৃষ্টান্ত (সাধারণত নিজের নিজের) ফেরত পাঠানোর দ্বারা স্বীকৃত)
কাঠামোগত নিদর্শন
Adapter ( বিভিন্ন ক্রমবর্ধমান / ইন্টারফেস টাইপের একটি দৃষ্টান্ত গ্রহণকারী ক্রিয়েশনাল পদ্ধতির দ্বারা স্বীকৃত এবং নিজের / অন্য বিমূর্ত / ইন্টারফেস টাইপ যা একটি প্রদত্ত উদাহরণকে সজ্জিত করে / ওভাররাইড করে)
-
java.util.Arrays#asList()
-
java.util.Collections#list()
-
java.util.Collections#enumeration()
-
java.io.InputStreamReader(InputStream)
(একটিReader
) -
java.io.OutputStreamWriter(OutputStream)
(একটিWriter
) -
javax.xml.bind.annotation.adapters.XmlAdapter#marshal()
এবংjavax.xml.bind.annotation.adapters.XmlAdapter#marshal()
#unmarshal()
Bridge (ক্রমাগত পদ্ধতিগুলি দ্বারা স্বীকৃত বিভিন্ন বিমূর্ত / ইন্টারফেস টাইপের একটি দৃষ্টান্ত গ্রহণ করে এবং নিজের বিমূর্ত / ইন্টারফেস টাইপের প্রতিনিধিত্ব করে যা প্রতিনিধিত্ব করে / প্রদত্ত উদাহরণটি ব্যবহার করে)
- কেউ এখনো মনে আসে। একটি fictive উদাহরণ
new LinkedHashMap(LinkedHashSet<K>, List<V>)
যা একটি অননুমোদিত লিঙ্কযুক্ত মানচিত্র প্রদান করে যা আইটেমগুলি ক্লোন করে না, তবে সেগুলি ব্যবহার করে।java.util.Collections#newSetFromMap()
এবংjava.util.Collections#newSetFromMap()
singletonXXX()
পদ্ধতিগুলি যদিও কাছাকাছি আসে।
Composite (আচরণগত পদ্ধতির দ্বারা স্বীকৃত যা একই বিমূর্ত / ইন্টারফেস টাইপকে একটি গাছ কাঠামোর মধ্যে গ্রহণ করে)
-
java.awt.Container#add(Component)
(কার্যত এইভাবে সব সুইং এর উপর) -
javax.faces.component.UIComponent#getChildren()
(কার্যত এই সমস্ত JSF UI এভাবে)
Decorator ( Decorator পদ্ধতির দ্বারা স্বীকৃত একই বিমূর্ত / ইন্টারফেস টাইপ যা অতিরিক্ত আচরণ যুক্ত করে)
-
java.io.InputStream
,OutputStream
,Reader
এবংWriter
এর সমস্ত উপশ্রেণীগুলি একই ধরণের উদাহরণ গ্রহণকারী একটি কন্সট্রকটর আছে। -
java.util.Collections
,checkedXXX()
,synchronizedXXX()
checkedXXX()
synchronizedXXX()
এবংunmodifiableXXX()
পদ্ধতি। -
HttpServletResponseWrapper
এবংHttpServletResponseWrapper
-
javax.swing.JScrollPane
Facade (আচরণগত পদ্ধতি দ্বারা স্বীকৃত যা অভ্যন্তরীণভাবে বিভিন্ন স্বাধীন বিমূর্ত / ইন্টারফেস ধরনের উদাহরণ ব্যবহার করে)
-
javax.faces.context.FacesContext
, এটি অভ্যন্তরীণভাবে অন্যান্যদের মধ্যে বিমূর্ত / ইন্টারফেস টাইপLifeCycle
,ViewHandler
,NavigationHandler
ViewHandler
এবং আরও অনেক কিছুকে ব্যতীত এটির বিষয়ে চিন্তা করতে হবে (যা ইনজেকশনের দ্বারা প্রযোজ্য নয়) ব্যতীত অন্যের মধ্যে ব্যবহার করে। -
javax.faces.context.ExternalContext
, যা অভ্যন্তরীণভাবেServletContext
,HttpSession
,HttpServletRequest
,HttpServletResponse
, ইত্যাদি ব্যবহার করে।
Flyweight (সৃষ্টিশীল পদ্ধতিগুলির দ্বারা স্বীকৃত একটি ক্যাশেড উদাহরণটি ফেরত দেওয়া, কিছুটা "বহু" ধারণা)
-
java.lang.Integer#valueOf(int)
(Boolean
,Byte
,Character
,Short
,Long
এবংBigDecimal
)
Proxy (সৃষ্টিকর্তা পদ্ধতিগুলি দ্বারা স্বীকৃত যা প্রদত্ত বিমূর্ত / ইন্টারফেস টাইপের বাস্তবায়ন ফেরত দেয় যা পাল্টে প্রতিনিধি / প্রদত্ত বিমূর্ত / ইন্টারফেস টাইপের একটি ভিন্ন বাস্তবায়ন ব্যবহার করে )
-
java.lang.reflect.Proxy
-
java.rmi.*
-
javax.ejb.EJB
( এখানে ব্যাখ্যা ) -
javax.inject.Inject
( এখানে ব্যাখ্যা ) -
javax.persistence.PersistenceContext
আচরণগত নিদর্শন
দায়িত্বের চেনা (আচরণগত পদ্ধতিগুলির দ্বারা স্বীকৃত যা (পরোক্ষভাবে) একই পদ্ধতিতে একই বিমূর্ত / ইন্টারফেস টাইপের একটি সারিতে প্রয়োগ করে)
Command (একটি বিমূর্ত / ইন্টারফেস টাইপের আচরণগত পদ্ধতিগুলির দ্বারা স্বীকৃত যা বিভিন্ন বিমূর্ত / ইন্টারফেস প্রকারের বাস্তবায়নে একটি পদ্ধতি চালু করে যা তার সৃষ্টির সময় কমান্ড বাস্তবায়ন দ্বারা আবদ্ধ হয়েছে)
-
java.lang.Runnable
সমস্ত বাস্তবায়ন -
javax.swing.Action
সব বাস্তবায়ন
Interpreter (প্রদত্ত পদ্ধতির দ্বারা স্বীকৃতিপ্রাপ্ত উদাহরণ / টাইপের স্ট্রাকচারালভাবে ভিন্ন উদাহরণ / টাইপ ফেরত পাঠানো; নোট করুন যে প্যার্সিং / ফর্ম্যাটিং প্যাটার্নের অংশ নয়, প্যাটার্ন নির্ধারণ করা এবং এটি কীভাবে প্রয়োগ করা যায়)
-
java.util.Pattern
-
java.text.Normalizer
-
java.text.Format
সমস্ত উপশ্রেণী -
javax.el.ELResolver
সব উপশ্রেণী
Iterator (আচরণগত পদ্ধতি দ্বারা স্বীকৃত একটি সারি থেকে একটি ভিন্ন ধরনের উদাহরণ ক্রমান্বয়ে ফিরে)
-
java.util.Iterator
সমস্ত বাস্তবায়ন (এভাবে অন্যদের মধ্যেjava.util.Scanner
!)। -
java.util.Enumeration
সব বাস্তবায়ন
Mediator (বিভিন্ন বিমূর্ত / ইন্টারফেসের ধরন (সাধারণত কমান্ড প্যাটার্ন ব্যবহার করে) যা একটি উদাহরণ প্রদান করে / ব্যবহার করে)
-
java.util.Timer
(সমস্তscheduleXXX()
java.util.Timer
(scheduleXXX()
পদ্ধতি) -
java.util.concurrent.Executor#execute()
-
java.util.concurrent.ExecutorService
(invokeXXX()
এবংsubmit()
পদ্ধতি) -
java.util.concurrent.ScheduledExecutorService
(সমস্তscheduleXXX()
java.util.concurrent.ScheduledExecutorService
(scheduleXXX()
পদ্ধতি) -
java.lang.reflect.Method#invoke()
Memento (আচরণগত পদ্ধতি দ্বারা স্বীকৃত যা অভ্যন্তরীণভাবে সম্পূর্ণ দৃষ্টান্ত অবস্থা পরিবর্তন)
-
java.util.Date
(সেটার পদ্ধতিগুলি করে,Date
অভ্যন্তরীণভাবেlong
মান দ্বারা উপস্থাপিত হয়) -
java.io.Serializable
সমস্ত বাস্তবায়ন -
javax.faces.component.StateHolder
সব বাস্তবায়ন
পর্যবেক্ষক (বা প্রকাশ / সাবস্ক্রাইব করুন) (আচরণগত পদ্ধতির দ্বারা স্বীকৃত যা অন্য রাষ্ট্রের উপর নির্ভর করে অন্য বিমূর্ত / ইন্টারফেস টাইপের উদাহরণে একটি পদ্ধতি চালু করে)
-
java.util.Observer
/java.util.Observable
(যদিও খুব কমই বাস্তব বিশ্বের ব্যবহার করা হয়) -
java.util.EventListener
সব বাস্তবায়ন (কার্যত এইভাবে সব সুইং সুইং) -
javax.servlet.http.HttpSessionBindingListener
-
javax.servlet.http.HttpSessionAttributeListener
-
javax.faces.event.PhaseListener
State (আচরণগত পদ্ধতি দ্বারা স্বীকৃত যা ঘটনাটির রাষ্ট্রের উপর নির্ভর করে যা তার বাহ্যিকভাবে নিয়ন্ত্রিত হতে পারে)
-
javax.faces.lifecycle.LifeCycle#execute()
(FacesServlet
দ্বারা নিয়ন্ত্রিত, আচরণটিFacesServlet
বর্তমান ফেজ (রাষ্ট্র) উপর নির্ভরশীল)
Strategy (একটি বিমূর্ত / ইন্টারফেস টাইপের আচরণগত পদ্ধতি দ্বারা স্বীকৃত যা বিভিন্ন বিমূর্ত / ইন্টারফেস প্রকারের বাস্তবায়নে একটি পদ্ধতি চালু করে যা কৌশল বাস্তবায়নে পদ্ধতির যুক্তি হিসাবে গৃহীত হয়েছে)
-
java.util.Comparator#compare()
, অন্যদের মধ্যেCollections#sort()
। -
doXXX()
,service()
এবং সমস্তdoXXX()
পদ্ধতিগুলিHttpServletRequest
এবংHttpServletResponse
গ্রহণHttpServletRequest
এবংHttpServletResponse
তাদের প্রক্রিয়া করতে হয় (এবং দৃষ্টান্তের পরিবর্তন হিসাবে তাদের ধরতে না!)। -
javax.servlet.Filter#doFilter()
টেমপ্লেট পদ্ধতি (আচরণগত পদ্ধতিগুলির দ্বারা স্বীকৃত যা ইতিমধ্যে একটি বিমূর্ত ধরন দ্বারা সংজ্ঞায়িত একটি "ডিফল্ট" আচরণ আছে)
-
java.io.InputStream
সব অ-বিমূর্ত পদ্ধতি, OutputStream , Reader এবং Writer । -
java.util.AbstractList
,java.util.AbstractSet
এবংjava.util.AbstractMap
এর সমস্ত অ-বিমূর্ত পদ্ধতি। -
doXXX()
, ডিফল্টরূপে সমস্তdoXXX()
পদ্ধতি প্রতিক্রিয়াতে একটি HTTP 405 "পদ্ধতি অনুমোদিত নয়" ত্রুটি পাঠায়। আপনি তাদের কেউ বা তাদের কেউ বাস্তবায়ন বিনামূল্যে।
Visitor (দুটি ভিন্ন বিমূর্ত / ইন্টারফেসের ধরন দ্বারা স্বীকৃত যা পদ্ধতিগুলি সংজ্ঞায়িত করে যা প্রতিটি বিমূর্ত / ইন্টারফেস টাইপ নেয়; এটি আসলে অন্যটির পদ্ধতি বলে এবং অন্যটি এতে পছন্দসই কৌশল চালায়)
যদিও আমি এই সাথে একটি ভাঙা ঘড়ি ধরনের, জাভা এক্সএমএল এপিআই অনেক ব্যবহার করে। আমি শুধু এই তাকান মানে:
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(source);
String title = XPathFactory.newInstance().newXPath().evaluate("//title", doc);
...এবং তাই এবং তাই ঘোষণা.
উপরন্তু বিভিন্ন বাফার (স্ট্রিংবফার, বাইটবফার, স্ট্রিংবিল্ডার) বিল্ডার ব্যবহার করুন।
java.util.Collection # Iterator একটি ফ্যাক্টরী পদ্ধতির একটি ভাল উদাহরণ। সংগ্রহের কংক্রিট সাবক্লাসের উপর নির্ভর করে আপনি এটি ব্যবহার করে একটি ইটারটর বাস্তবায়ন তৈরি করবেন। কারণ ফ্যাক্টরি সুপারক্লাস (সংগ্রহ) এবং ইন্টেরেটর উভয়ই ইন্টারফেস তৈরি করে, এটি কখনও কখনও এবস্রাস্ট্রাক্রাকচারের সাথে বিভ্রান্ত। গৃহীত উত্তর (বেলুস সি) এ এবস্রাস্ট্রাক্টরী এর উদাহরণগুলির বেশিরভাগ উদাহরণ ফ্যাক্টরী পদ্ধতির একটি সরলীকৃত সংস্করণ, যা মূল GoF রীতির অংশ নয়। ফ্যাকরিটিতে ফ্যাক্টরি ক্লাসের অনুক্রমটি ভেঙ্গে গেছে এবং ফ্যাক্টরিটি পণ্যটি ফেরত দিতে অন্য উপায় ব্যবহার করে।
- বিমূর্ত কারখানা
একটি বিমূর্ত কারখানাটিতে একাধিক কারখানা পদ্ধতি রয়েছে, প্রতিটি একটি ভিন্ন পণ্য তৈরি করে। এক ফ্যাক্টরি দ্বারা উৎপাদিত পণ্যগুলির একসাথে ব্যবহার করা হয় (আপনার মুদ্রক এবং কার্টিজগুলি একই (বিমূর্ত) কারখানার থেকে ভাল হবে। প্ল্যাটফর্ম থেকে প্ল্যাটফর্মে বিভক্ত, এডব্লিউটি GUI উপাদানগুলির পরিবারের উপরে উত্তরগুলিতে উল্লেখ করা হয়েছে, এটির একটি উদাহরণ (যদিও এটির প্রয়োগটি গোফতে বর্ণিত কাঠামোর থেকে আলাদা)।