CSC/ECE 517 Fall 2011/ch4 4h lp
Introduction
This wiki article discusses about some of the commonly used & easy to understand Desgin patterns[1] in the software industry. Specifically, we will be studying about the Singleton, Adapter, Command & Strategy patterns.
Design Pattern
Definition
Examples
Case Study
Singleton
Singleton is a design pattern which imposes a restriction on the class to instantiate exactly one object of that class.
Implementation
- In Java, We can create a thread-safe & lazy version of Singleton as follows. The comments in the code help you understand the Lazy & thread-safe aspect of it.
public class Singleton { private static Singleton instance; private Singleton() { //Do nothing. Initialize the object only when the first time getInstance() is called. } public static synchronized Singleton getInstance() { //The keyword "synchronized" makes it thread safe so that two threads invoking getInstance() //at the same time cannot create two instances when a context switch happens so as to //facilitate this scenario. In general this can happen even with 'n' threads invoking getInstance(). //"synchronized" keyword is used to eliminate such scenarios. if (null == instance) { instance = new Singleton(); } return instance; } }
- In Ruby, we can achieve singleton classes by mixing-in the 'Singleton' module as follows. Here, "SingletonClass" is the name of the singleton class that is being created.
require 'singleton' class SingletonClass include Singleton ... end
When should we use Singleton ? <ref>When should we use Singleton ?</ref>
There is a lot of criticism to the use of singleton pattern. So, how do we decide whether an object should be singleton or not ? For an object to be considered as a singleton object, they must satisfy three requirements:
- controls concurrent access to a shared resource.
- access to the resource will be requested from multiple, disparate parts of the system.
- there can be only one object.
Applications
Advantages
- Singletons are often preferred to global variables as they don't pollute the global namespace with unnecessary variables & also can be instantiated only when needed unlike global variables which always consume resources.
Drawbacks
- Introduces a global state into the application.
- Can make unit testing classes in isolation difficult.
Checkout the this video from Misko Hevery which explains in detail when the usage of singletons is not exercised.<ref>Why Singletons are bad</ref>
Adapter
Command
Strategy
Conclusion
References
<references/>