SlideShare a Scribd company logo
Singleton
Agenda Singleton – Intent Singleton classic - Java 5 Case study – To implement singleton. Singleton – IOC
Singleton Intent Singleton pattern  ensures a class has  only one instance ,  and provides a global point of access to it. Advantages Controlled Access to sole instance Reduced name space (Global variable) Provides a variable number of instances More flexible
Singleton Classic CacheManager.getInstance() private constructor public class CacheManager { private static final CacheManager CACHE_MGR = new CacheManager (); private CacheManager {} private Map<String,Object> cache; public static CacheManager  getInstance() { return CACHE_MGR; } public Object get(String key) { //code for getting the object from cache; }}
Singleton Classic – Java 5 Boiler plate code for getInstance(), private constructor avoided. import static CacheManager.CACHE_MGR; public class CacheClient{ public static void main(String a[]){ CACHE_MGR.get(“testCache”); }} public  enum  CacheManager { CACHE_MGR; private Map<String,Object> cache; public Object get(String key) { //code for getting the object from cache; } public void put(String key,Object val) { //code for put the object in cache; } }
Case - Study
Notice Board detailed Domain
OnSubmit for send Message Static binding Singleton as Evil
Singleton public class MessageBroadCaster { private static final MessageBroadCaster INSTANCE = new MessageBroadCaster();  private MessageBroadCaster() {} public static MessageBroadCaster  getInstance () { return INSTANCE; } public void broadCast(final String[] messages) { final NoticeBoard board = NoticeBoard.getInstance(); int i = 0; final Message[] todayMessages = new Message[messages.length]; for(final String message : messages) { todayMessages[i++] = new Message(message); } board.show(todayMessages); } } public class NoticeBoard { private static final NoticeBoard noticeBoardInstance = new NoticeBoard(); private NoticeBoard   () {} public static NoticeBoard  getInstance () { return noticeBoardInstance;  } public void show(final Message[] messages){ for(Message msg : messages) msg.display();  } } Global Variables are many … Class operation
Change We need more notice boards to broadcast the message Electronic Notice board LCD Notice Board ..much more How we can add these change ? Great  OO software must have Flexible
Patterns Patterns are used to solve the common set of problems Don’t start to think on patterns. Choose patterns which is very relative and solve your problem ( If we found)
Abstraction
public class MessageBroadCaster{ private NoticeBoard noticeBoard; public MessageBroadCaster(NoticeBoard noticeBoard) { this.noticeBoard = noticeBoard; }  public void broadCast(final String[] messages) { int i = 0; final Message[] todayMessages = new Message[messages.length]; for(final String message : messages) { todayMessages[i++] = new Message(message); } noticeBoard.show(todayMessages); } } Abstraction class Simple implements NoticeBoard{ public void show(Message[] messages) { System.out.println(&quot;Simple Display ...&quot;); for(Message message: messages) { System.out.println(message.getContent()); } } } Instance operation, with good abstraction
Modules Sequence Simple Messenger Simple Message  Broadcaster Simple  Notice Board sends broadcast Simple LCD Messenger LCD Message  Broadcaster LCD  Notice Board sends broadcast LCD Electronic Messenger Electronic Message  Broadcaster Electronic  Notice Board sends broadcast Electronic This is not a
How to create Messenger for other modules like LCD,Electronic ..etc public class Messenger  { private MessageBroadCaster messageBroadCaster; public Messenger(MessageBroadCaster messageBroadCaster) { this.messageBroadCaster = messageBroadCaster; } public void send(String[] messages) { messageBroadCaster.broadCast(messages); } public static void main(String[] args) { NoticeBoard  simpleNoticeBoard  = new  Simple (); MessageBroadCaster simpleMessageBroadCaster = new MessageBroadCaster(simpleNoticeBoard) ; Messenger simpleMessenger = new Messenger(simpleMessageBroadCaster); simpleMessenger.send (new String[] { &quot;Welcome to Singleton&quot; , &quot;Town hall meet&quot; }); } } Simple Module Simple Notice Board flow or Module has been tested.
Solve the problem of creation Good programming practice (idioms) will help us to solve Depends on abstraction not to implementation. Singleton    if needed.
Program Idiom public class NoticeBoardFactory { public NoticeBoard createNoticeBoard(String type)  { if(&quot;Simple&quot;.equals(type)) { return new Simple(); } else if(&quot;LCD&quot;.equals(type)){ return new LCD(); } else if(&quot;Electronic&quot;.equals(type)) { return new Electronic(); } else { return null; }}} public static void main(String[] args)  { NoticeBoardFactory boardFactory = new NoticeBoardFactory(); NoticeBoard simpleNoticeBoard =  boardFactory.createNoticeBoard(&quot;Simple&quot;);   MessageBroadCaster simpleMessageBroadCaster = new MessageBroadCaster(simpleNoticeBoard); Messenger simpleMessnger = new Messenger(simpleMessageBroadCaster); simpleMessnger.send(new String[] { &quot;Welcome to Singleton&quot; , &quot;Town hall meet&quot; }); } Note: We can avoid this if instead use Map, to look for specific type Creation of NoticeBoard becomes Abstract, using a program idiom
Module - IOC class MessengerModule{ private NoticeBoard noticeBoard; private MessageBroadCaster messageBroadCaster; private Messenger messenger; public MessengerModule(String type) { noticeBoard =  new NoticeBoardFactory().createNoticeBoard(type); messageBroadCaster =  new MessageBroadCaster(noticeBoard); messenger =  new Messenger(messageBroadCaster); } public void send(String[] messages) { messenger.send(messages); } } MessengerModule simpleModule = new MessengerModule(&quot;Simple&quot;); simpleModule.send(new String[] { &quot;Welcome to Singleton&quot; , &quot;Town hall meet&quot; }); MessengerModule lcdModule = new MessengerModule(&quot;LCD&quot;); lcdModule.send(new String[] { &quot;Welcome to Singleton&quot; , &quot;Town hall meet&quot; }); MessengerModule electronicModule = new MessengerModule(&quot;Electronic&quot;);   electronicModule.send(new String[] { &quot;Welcome to Singleton&quot; , &quot;Town hall meet&quot; });
Is flexible ? BroadCaster behavior is different based on the messenger SimpleBroadCaster creates Simple Message LCDBroadCaster creates LCD Message ElectronicBroadCaster creates Electronic Message Can we apply it in our design ?
Flexible
Module – More Abstraction class MessengerModule{ private NoticeBoard noticeBoard; private MessageBroadCaster messageBroadCaster; private Messenger messenger; public MessengerModule(String type) { noticeBoard =  new NoticeBoardFactory().createNoticeBoard(type); messageBroadCaster =  new MessageBroadCasterFactory().createMessageBroadCaster(type,noticeBoard); messenger =  new MessengerFactory().createMessenger(type, messageBroadCaster); } public void send(String[] messages) { messenger.send(messages); }}
Module - Control Messenger module object gives access to the messenger for the client We need only 3 set messenger objects Simple LCD Electronic How to solve this problem ?
class MessengerModule{ private NoticeBoard noticeBoard; private MessageBroadCaster messageBroadCaster; private Messenger messenger; private static final Map<String, MessengerModule> MSG_MODULES = new HashMap<String, MessengerModule>(); public static MessengerModule getInstance(String type)  { MessengerModule messengerModule =  MSG_MODULES.get(type); if(messengerModule == null)  { messengerModule = new MessengerModule(type); MSG_MODULES.put(type,messengerModule); } return messengerModule; } private MessengerModule(String type) { noticeBoard = new NoticeBoardFactory().createNoticeBoard(type); messageBroadCaster = new MessageBroadCasterFactory().createMessageBroadCaster(type,noticeBoard); messenger = new MessengerFactory().createMessenger(type, messageBroadCaster);} public void send(String[] messages) { messenger.send(messages); } } Module – Singleton Classic
Module – Singleton – Java5 enum MessengerModule { Simple,LCD, Electronic; private NoticeBoard noticeBoard; private MessageBroadCaster messageBroadCaster; private Messenger messenger; public static MessengerModule getInstance(String type) { return valueOf(type); } private MessengerModule() { noticeBoard = new NoticeBoardFactory().createNoticeBoard(this.name()); messageBroadCaster = new MessageBroadCasterFactory().createMessageBroadCaster(this.name(),noticeBoard); messenger = new MessengerFactory().createMessenger(this.name(), messageBroadCaster); } public void send(String[] messages){ messenger.send(messages); }}
Test public class MessengerClient { public static void main(String[] args){ String[] messages = new String[] { &quot;Welcome to Singleton&quot; , &quot;Town hall meet&quot; }; MessengerModule.LCD.send(messages); MessengerModule.getInstance(&quot;Simple&quot;).send(messages); MessengerModule.getInstance(&quot;Electronic&quot;).send(messages); } } Output LCD Display ... Welcome to Singleton Town hall meet Simple Display ... Welcome to Singleton Town hall meet Electronic Display ... Welcome to Singleton Town hall meet
Summary Singleton is a good pattern easy to apply, but ask more questions before going to implement Don't make Singleton for ONLY HAVE SINGLE OBJECT, unless you really need .. Singleton has to provide access to set of Objects Most applied when you have Factory (Creator) object OR Facade (Controller)  Object. Strive for loosely coupled (De-coupled) collaboration
Refferences Guice / Spring DI framework Books Applying Uml Patterns  Head First Design Patterns GOF patterns(Elements of re-usable OO Software) Effective Java
Thanks ...

More Related Content

PDF
4Developers: Dominik Przybysz- Message Brokers
PDF
03 - Qt UI Development
ODP
Treinamento Qt básico - aula II
PPTX
Introduction à dart
PDF
Java Concurrency Idioms
PDF
Cracking JWT tokens: a tale of magic, Node.JS and parallel computing
PDF
Devoxx 2012 (v2)
PDF
Observer pattern with Stl, boost and qt
4Developers: Dominik Przybysz- Message Brokers
03 - Qt UI Development
Treinamento Qt básico - aula II
Introduction à dart
Java Concurrency Idioms
Cracking JWT tokens: a tale of magic, Node.JS and parallel computing
Devoxx 2012 (v2)
Observer pattern with Stl, boost and qt

What's hot (19)

PDF
Java Concurrency Gotchas
PDF
Best Practices in Qt Quick/QML - Part IV
 
PPTX
Windows Azure Storage
PDF
The Ring programming language version 1.3 book - Part 7 of 88
PDF
Actor Concurrency
PDF
Best Practices in Qt Quick/QML - Part II
 
PDF
Lecture 3: Storage and Variables
PDF
Voce Tem Orgulho Do Seu Codigo
DOC
Id32
PDF
Compact and safely: static DSL on Kotlin
PDF
Integrazione QML / C++
PDF
Di web tech mail (no subject)
ODP
Fighting null with memes
DOCX
Laporan multi client
PPTX
Design pattern - part 3
PPTX
Design pattern part 2 - structural pattern
PPTX
Android
PPTX
MongoDB Live Hacking
PDF
Java Concurrency Gotchas
Java Concurrency Gotchas
Best Practices in Qt Quick/QML - Part IV
 
Windows Azure Storage
The Ring programming language version 1.3 book - Part 7 of 88
Actor Concurrency
Best Practices in Qt Quick/QML - Part II
 
Lecture 3: Storage and Variables
Voce Tem Orgulho Do Seu Codigo
Id32
Compact and safely: static DSL on Kotlin
Integrazione QML / C++
Di web tech mail (no subject)
Fighting null with memes
Laporan multi client
Design pattern - part 3
Design pattern part 2 - structural pattern
Android
MongoDB Live Hacking
Java Concurrency Gotchas
Ad

Viewers also liked (6)

PPSX
Presentation1
PPSX
LJO Portfolio
PPTX
Assigment 3 Team 4
PPTX
People
ODP
Lp screenshots
PPTX
Inaugural Philadelphia WordPress Meetup
Presentation1
LJO Portfolio
Assigment 3 Team 4
People
Lp screenshots
Inaugural Philadelphia WordPress Meetup
Ad

Similar to Singleton (20)

PPTX
Lecture 13, 14 & 15 c# cmd let programming and scripting
PPT
Defining classes-and-objects-1.0
PPT
Oop lecture5
PPT
Core Java
PPT
PDF
Lecture 4: Data Types
PPTX
C# Generics
KEY
Polymorphism
PPT
Sw Software Design
PDF
Clojure, Plain and Simple
ODP
Machine-level Composition of Modularized Crosscutting Concerns
PPTX
Chapter ii(oop)
PPT
Introduction to csharp
PPT
Introduction to csharp
PPT
Introduction to csharp
PPT
Object Oriented Programming with Java
PPTX
Classes, objects in JAVA
PDF
Better Software: introduction to good code
PDF
Mobile Software Engineering Crash Course - C02 Java Primer
PDF
Design Patterns - GOF
Lecture 13, 14 & 15 c# cmd let programming and scripting
Defining classes-and-objects-1.0
Oop lecture5
Core Java
Lecture 4: Data Types
C# Generics
Polymorphism
Sw Software Design
Clojure, Plain and Simple
Machine-level Composition of Modularized Crosscutting Concerns
Chapter ii(oop)
Introduction to csharp
Introduction to csharp
Introduction to csharp
Object Oriented Programming with Java
Classes, objects in JAVA
Better Software: introduction to good code
Mobile Software Engineering Crash Course - C02 Java Primer
Design Patterns - GOF

Recently uploaded (20)

PPTX
Evolution_of_Computing_Presentation (1).pptx
PPTX
BSCS lesson 3.pptxnbbjbb mnbkjbkbbkbbkjb
PDF
Pongal 2026 Sponsorship Presentation - Bhopal Tamil Sangam
PPTX
22CDH01-V3-UNIT III-UX-UI for Immersive Design
PPTX
VERNACULAR_DESIGN_PPT FINAL WITH PROPOSED PLAN.pptx
PPTX
timber basics in structure mechanics (dos)
PPTX
CLASSIFICATION OF YARN- process, explanation
PPTX
CLASS_11_BUSINESS_STUDIES_PPT_CHAPTER_1_Business_Trade_Commerce.pptx
PDF
THEORY OF ID MODULE (Interior Design Subject)
PDF
321 LIBRARY DESIGN.pdf43354445t6556t5656
PDF
GSH-Vicky1-Complete-Plans on Housing.pdf
PPTX
22CDO02-IMGD-UNIT-I-MOBILE GAME DESIGN PROCESS
PDF
Design Thinking - Module 1 - Introduction To Design Thinking - Dr. Rohan Dasg...
PPTX
NEW EIA PART B - Group 5 (Section 50).pptx
PPT
EthicsNotesSTUDENTCOPYfghhnmncssssx sjsjsj
PPTX
Entrepreneur intro, origin, process, method
PDF
intro_to_rust.pptx_123456789012446789.pdf
PDF
Chalkpiece Annual Report from 2019 To 2025
PDF
Introduction-to-World-Schools-format-guide.pdf
PPTX
DOC-20250430-WA0014._20250714_235747_0000.pptx
Evolution_of_Computing_Presentation (1).pptx
BSCS lesson 3.pptxnbbjbb mnbkjbkbbkbbkjb
Pongal 2026 Sponsorship Presentation - Bhopal Tamil Sangam
22CDH01-V3-UNIT III-UX-UI for Immersive Design
VERNACULAR_DESIGN_PPT FINAL WITH PROPOSED PLAN.pptx
timber basics in structure mechanics (dos)
CLASSIFICATION OF YARN- process, explanation
CLASS_11_BUSINESS_STUDIES_PPT_CHAPTER_1_Business_Trade_Commerce.pptx
THEORY OF ID MODULE (Interior Design Subject)
321 LIBRARY DESIGN.pdf43354445t6556t5656
GSH-Vicky1-Complete-Plans on Housing.pdf
22CDO02-IMGD-UNIT-I-MOBILE GAME DESIGN PROCESS
Design Thinking - Module 1 - Introduction To Design Thinking - Dr. Rohan Dasg...
NEW EIA PART B - Group 5 (Section 50).pptx
EthicsNotesSTUDENTCOPYfghhnmncssssx sjsjsj
Entrepreneur intro, origin, process, method
intro_to_rust.pptx_123456789012446789.pdf
Chalkpiece Annual Report from 2019 To 2025
Introduction-to-World-Schools-format-guide.pdf
DOC-20250430-WA0014._20250714_235747_0000.pptx

Singleton

  • 2. Agenda Singleton – Intent Singleton classic - Java 5 Case study – To implement singleton. Singleton – IOC
  • 3. Singleton Intent Singleton pattern ensures a class has only one instance , and provides a global point of access to it. Advantages Controlled Access to sole instance Reduced name space (Global variable) Provides a variable number of instances More flexible
  • 4. Singleton Classic CacheManager.getInstance() private constructor public class CacheManager { private static final CacheManager CACHE_MGR = new CacheManager (); private CacheManager {} private Map<String,Object> cache; public static CacheManager getInstance() { return CACHE_MGR; } public Object get(String key) { //code for getting the object from cache; }}
  • 5. Singleton Classic – Java 5 Boiler plate code for getInstance(), private constructor avoided. import static CacheManager.CACHE_MGR; public class CacheClient{ public static void main(String a[]){ CACHE_MGR.get(“testCache”); }} public enum CacheManager { CACHE_MGR; private Map<String,Object> cache; public Object get(String key) { //code for getting the object from cache; } public void put(String key,Object val) { //code for put the object in cache; } }
  • 8. OnSubmit for send Message Static binding Singleton as Evil
  • 9. Singleton public class MessageBroadCaster { private static final MessageBroadCaster INSTANCE = new MessageBroadCaster(); private MessageBroadCaster() {} public static MessageBroadCaster getInstance () { return INSTANCE; } public void broadCast(final String[] messages) { final NoticeBoard board = NoticeBoard.getInstance(); int i = 0; final Message[] todayMessages = new Message[messages.length]; for(final String message : messages) { todayMessages[i++] = new Message(message); } board.show(todayMessages); } } public class NoticeBoard { private static final NoticeBoard noticeBoardInstance = new NoticeBoard(); private NoticeBoard () {} public static NoticeBoard getInstance () { return noticeBoardInstance; } public void show(final Message[] messages){ for(Message msg : messages) msg.display(); } } Global Variables are many … Class operation
  • 10. Change We need more notice boards to broadcast the message Electronic Notice board LCD Notice Board ..much more How we can add these change ? Great OO software must have Flexible
  • 11. Patterns Patterns are used to solve the common set of problems Don’t start to think on patterns. Choose patterns which is very relative and solve your problem ( If we found)
  • 13. public class MessageBroadCaster{ private NoticeBoard noticeBoard; public MessageBroadCaster(NoticeBoard noticeBoard) { this.noticeBoard = noticeBoard; } public void broadCast(final String[] messages) { int i = 0; final Message[] todayMessages = new Message[messages.length]; for(final String message : messages) { todayMessages[i++] = new Message(message); } noticeBoard.show(todayMessages); } } Abstraction class Simple implements NoticeBoard{ public void show(Message[] messages) { System.out.println(&quot;Simple Display ...&quot;); for(Message message: messages) { System.out.println(message.getContent()); } } } Instance operation, with good abstraction
  • 14. Modules Sequence Simple Messenger Simple Message Broadcaster Simple Notice Board sends broadcast Simple LCD Messenger LCD Message Broadcaster LCD Notice Board sends broadcast LCD Electronic Messenger Electronic Message Broadcaster Electronic Notice Board sends broadcast Electronic This is not a
  • 15. How to create Messenger for other modules like LCD,Electronic ..etc public class Messenger { private MessageBroadCaster messageBroadCaster; public Messenger(MessageBroadCaster messageBroadCaster) { this.messageBroadCaster = messageBroadCaster; } public void send(String[] messages) { messageBroadCaster.broadCast(messages); } public static void main(String[] args) { NoticeBoard simpleNoticeBoard = new Simple (); MessageBroadCaster simpleMessageBroadCaster = new MessageBroadCaster(simpleNoticeBoard) ; Messenger simpleMessenger = new Messenger(simpleMessageBroadCaster); simpleMessenger.send (new String[] { &quot;Welcome to Singleton&quot; , &quot;Town hall meet&quot; }); } } Simple Module Simple Notice Board flow or Module has been tested.
  • 16. Solve the problem of creation Good programming practice (idioms) will help us to solve Depends on abstraction not to implementation. Singleton  if needed.
  • 17. Program Idiom public class NoticeBoardFactory { public NoticeBoard createNoticeBoard(String type) { if(&quot;Simple&quot;.equals(type)) { return new Simple(); } else if(&quot;LCD&quot;.equals(type)){ return new LCD(); } else if(&quot;Electronic&quot;.equals(type)) { return new Electronic(); } else { return null; }}} public static void main(String[] args) { NoticeBoardFactory boardFactory = new NoticeBoardFactory(); NoticeBoard simpleNoticeBoard = boardFactory.createNoticeBoard(&quot;Simple&quot;); MessageBroadCaster simpleMessageBroadCaster = new MessageBroadCaster(simpleNoticeBoard); Messenger simpleMessnger = new Messenger(simpleMessageBroadCaster); simpleMessnger.send(new String[] { &quot;Welcome to Singleton&quot; , &quot;Town hall meet&quot; }); } Note: We can avoid this if instead use Map, to look for specific type Creation of NoticeBoard becomes Abstract, using a program idiom
  • 18. Module - IOC class MessengerModule{ private NoticeBoard noticeBoard; private MessageBroadCaster messageBroadCaster; private Messenger messenger; public MessengerModule(String type) { noticeBoard = new NoticeBoardFactory().createNoticeBoard(type); messageBroadCaster = new MessageBroadCaster(noticeBoard); messenger = new Messenger(messageBroadCaster); } public void send(String[] messages) { messenger.send(messages); } } MessengerModule simpleModule = new MessengerModule(&quot;Simple&quot;); simpleModule.send(new String[] { &quot;Welcome to Singleton&quot; , &quot;Town hall meet&quot; }); MessengerModule lcdModule = new MessengerModule(&quot;LCD&quot;); lcdModule.send(new String[] { &quot;Welcome to Singleton&quot; , &quot;Town hall meet&quot; }); MessengerModule electronicModule = new MessengerModule(&quot;Electronic&quot;); electronicModule.send(new String[] { &quot;Welcome to Singleton&quot; , &quot;Town hall meet&quot; });
  • 19. Is flexible ? BroadCaster behavior is different based on the messenger SimpleBroadCaster creates Simple Message LCDBroadCaster creates LCD Message ElectronicBroadCaster creates Electronic Message Can we apply it in our design ?
  • 21. Module – More Abstraction class MessengerModule{ private NoticeBoard noticeBoard; private MessageBroadCaster messageBroadCaster; private Messenger messenger; public MessengerModule(String type) { noticeBoard = new NoticeBoardFactory().createNoticeBoard(type); messageBroadCaster = new MessageBroadCasterFactory().createMessageBroadCaster(type,noticeBoard); messenger = new MessengerFactory().createMessenger(type, messageBroadCaster); } public void send(String[] messages) { messenger.send(messages); }}
  • 22. Module - Control Messenger module object gives access to the messenger for the client We need only 3 set messenger objects Simple LCD Electronic How to solve this problem ?
  • 23. class MessengerModule{ private NoticeBoard noticeBoard; private MessageBroadCaster messageBroadCaster; private Messenger messenger; private static final Map<String, MessengerModule> MSG_MODULES = new HashMap<String, MessengerModule>(); public static MessengerModule getInstance(String type) { MessengerModule messengerModule = MSG_MODULES.get(type); if(messengerModule == null) { messengerModule = new MessengerModule(type); MSG_MODULES.put(type,messengerModule); } return messengerModule; } private MessengerModule(String type) { noticeBoard = new NoticeBoardFactory().createNoticeBoard(type); messageBroadCaster = new MessageBroadCasterFactory().createMessageBroadCaster(type,noticeBoard); messenger = new MessengerFactory().createMessenger(type, messageBroadCaster);} public void send(String[] messages) { messenger.send(messages); } } Module – Singleton Classic
  • 24. Module – Singleton – Java5 enum MessengerModule { Simple,LCD, Electronic; private NoticeBoard noticeBoard; private MessageBroadCaster messageBroadCaster; private Messenger messenger; public static MessengerModule getInstance(String type) { return valueOf(type); } private MessengerModule() { noticeBoard = new NoticeBoardFactory().createNoticeBoard(this.name()); messageBroadCaster = new MessageBroadCasterFactory().createMessageBroadCaster(this.name(),noticeBoard); messenger = new MessengerFactory().createMessenger(this.name(), messageBroadCaster); } public void send(String[] messages){ messenger.send(messages); }}
  • 25. Test public class MessengerClient { public static void main(String[] args){ String[] messages = new String[] { &quot;Welcome to Singleton&quot; , &quot;Town hall meet&quot; }; MessengerModule.LCD.send(messages); MessengerModule.getInstance(&quot;Simple&quot;).send(messages); MessengerModule.getInstance(&quot;Electronic&quot;).send(messages); } } Output LCD Display ... Welcome to Singleton Town hall meet Simple Display ... Welcome to Singleton Town hall meet Electronic Display ... Welcome to Singleton Town hall meet
  • 26. Summary Singleton is a good pattern easy to apply, but ask more questions before going to implement Don't make Singleton for ONLY HAVE SINGLE OBJECT, unless you really need .. Singleton has to provide access to set of Objects Most applied when you have Factory (Creator) object OR Facade (Controller) Object. Strive for loosely coupled (De-coupled) collaboration
  • 27. Refferences Guice / Spring DI framework Books Applying Uml Patterns Head First Design Patterns GOF patterns(Elements of re-usable OO Software) Effective Java