CSC/ECE 517 Fall 2012/ch2b 2w53 iv: Difference between revisions

From Expertiza_Wiki
Jump to navigation Jump to search
No edit summary
No edit summary
Line 147: Line 147:


/**
/**
@return The unique instance of this class.
          @return The unique instance of this class.
/
        */
static public Singleton instance() {
static public Singleton instance() {
if(null == _instance) {
if(null == _instance) {
instance_helper();
System.out.println("CREATE NEW SYSTEM INSTANCE!!!!!!!!!!");
        instance_helper();
System.out.println("CREATE NEW  
          SYSTEM INSTANCE!!!!!!!!!!");
}else{
}else{
System.out.println("REUSE THE SAME SYSTEM INSTANCE!!");
System.out.println("REUSE THE SAME SYSTEM INSTANCE!!");
}
}
return _instance;
return _instance;
Line 160: Line 162:


/**
/**
Solution for thread safe issue, only one thread can create Singleton object.
        Solution for thread safe issue, only one thread can create Singleton object.
And reduce the expensive cost of synchonize since this method is only call
        And reduce the expensive cost of synchonize since this method is only call
only one time.
        only one time.
/
        */
static private synchronized Singleton instance_helper(){
static private synchronized Singleton instance_helper(){
_instance = new Singleton();
_instance = new Singleton();
return _instance;
return _instance;
}
}


Except it doesn't work. "_instance" can be null in the logic for multiple threads before instance_helper is called, leading to multiple instances being created. See DoubleCheckedLockingIsBroken.
        /**Except it doesn't work. "_instance" can be null in the logic for multiple threads and multiple instances being created.*/


How about putting a flag in synchronized method ?
        /*How about putting a flag in synchronized method ?*/
static private synchronized Singleton instance_helper(){
static private synchronized Singleton instance_helper(){
if(flag){
if(flag){

Revision as of 14:24, 18 November 2012

Singleton, directory of sites

Singleton, directory of sites Pattern

1. Singleton on the Wikipedia

Topics Covered : Common uses, UML, Implementation, Example, Prototype based singleton, Example of use with factory method pattern

Summary : This link firstly provides the basic definition of the singleton pattern as a design pattern that restricts the instantiation of a class to one object. Singleton patters are mostly used in Abstract Factory, Builder, and Prototype, and Facade patterns.

Both the UML representation of singleton where the same single instance is always returned and the implementation concerning the mechanism to access the singleton class member without creating a class object and a mechanism to persist the value of class members among the class objects. The link also points out that if a class has to realize a contract expressed by an interface, it really has to be a singleton.

Lazy initialization uses double-checking and eager initialization which always creates an instance. For instance, Lazy initialization and Eager Initialization example codes are: Lazy Initialization:

public class SingletonDemo {
private static volatile SingletonDemo instance = null;
private SingletonDemo() {}
public static SingletonDemo getInstance() {
if (instance == null) {
  synchronized (SingletonDemo .class){
  if (instance == null) {
  instance = new SingletonDemo ();
                      }
                   }
              }
return instance;
}
}

Eager Initialization:

public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}

It also talks about Prototype-based programming in which objects but not classes are used, a 'singleton' simply refers to an object without copies or that is not used as the prototype for any other object. Eg :->

Foo := Object clone 
Foo clone := Foo

Drawbacks : The pattern makes unit testing far more difficult as it introduces global state into an application. It should also be noted that this pattern reduces the potential for parallelism within a program, because access to the singleton in a multi-threaded context must be serialized.

2. Learn Singleton-design-Pattern

Topics Covered : Definition, When to use, how to create, Sharing across all users, Sharing across a request, Sharing across a single user

Summary : This article explains what Singleton pattern is, what kind of problem it generally solves and how should it be implemented in ASP.NET. The Singleton pattern which ensures that only one instance of a given object can exist at a context solves problems related to object creation and hence is a type of creational pattern.

It can be used in a class that wraps the settings related to an application. In other words, whenever we want something to be shared across multiple locations, we use a singleton pattern. In order to create a Singleton pattern, we can render the constructor private so that no user can create a new instance outside the class, that way ensuring only one instance of the objects always exists. In that case, we also need to create a static method that returns the single object.

Singleton patterns in ASP.NET are implemented by using static objects which maintain their values and reside in the memory as long as the application which contains it does. The sharing can occur across users, or requests or across a single user.

3. Singleton - Creational Design Pattern

Topics Covered : Intent, Description, An Example, Implementation, Benefits

Summary : It firstly talks about the intent behind singleton design pattern, in that there is a need to have a class that can be instantiated only once. Then, it describes two solutions for implementing the singleton class. In the first, there should be only one shared object and reference to that shared object should be available through a static method GetInstance() while the constructor is private. The second solution expects the constructor to be public but once an object has been instantiated, an exception should be thrown for each successive constructor call.

The code for each case is given as follows:

Case 1 :

class Singleton
{
private static Singleton instance;
private static int numOfReference;
private string code;
private Singleton()
{
numOfReference = 0;
code = "Maasoom Faraz";
}
public static Singleton GetInstance()
{
if(instance == null)
{
instance = new Singleton();
}
numOfReference++;
return instance;
}
public static int Reference
{
get { return numOfReference; }
}
public string Code
{
get { return code; }
set { code = value;}
}
}

The constructor is made private and used to initialize the numOfReference and default value of code. GetInstance() method checks the instance, if it is null then it assign it an instance of Singleton otherwise return the old reference.

Case 2 :

class Singleton2
{
private static int numOfInstance = 0;
public Singleton2()
{
if(numOfInstance == 0)
{
Console.WriteLine("\r\nCreating First Object of Singleton2 class...");
numOfInstance++;
}
else
{
throw new Exception("This class is Singleton,
+ so only one object of it can be instantiated.");
}
}
}

Here we make the constructor public and use a private field numOfInstance which is incremented for each constructor call. If numOfInstance is zero (no object is yet instantiated), a new object is allowed to made. But, if this value is not zero (there is already an object of Singleton2 class, an exception is thrown.


\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/

1. Singleton explained on c2.com

Topics Covered : Simulation of global variables, Appropriate Use of Singleton, Singleton in threaded environment

Summary : This link firstly explains aspects like testing, creational logic,polymorphism involved in singleton pattern.It explains situations when singleton pattern can be used.It goes on to explain the anti-pattern of singletons simulating global variables and appropriate use of singleton in mutithreaded environment.

Author's solution is create a private synchronized method. :

/**

         @return The unique instance of this class.
       */

static public Singleton instance() { if(null == _instance) {

        instance_helper();

System.out.println("CREATE NEW

         SYSTEM INSTANCE!!!!!!!!!!");		

}else{ System.out.println("REUSE THE SAME SYSTEM INSTANCE!!"); } return _instance; }

/**

       Solution for thread safe issue, only one thread can create Singleton object.
       And reduce the expensive cost of synchonize since this method is only call
       only one time.
        */

static private synchronized Singleton instance_helper(){ _instance = new Singleton(); return _instance; }

       /**Except it doesn't work. "_instance" can be null in the logic for multiple threads and multiple instances being created.*/
        /*How about putting a flag in synchronized method ?*/

static private synchronized Singleton instance_helper(){ if(flag){ _instance = new Singleton(); } flag = false; return _instance; }



<references />