CSC/ECE 517 Fall 2007/wiki1b 6 c1: Difference between revisions

From Expertiza_Wiki
Jump to navigation Jump to search
No edit summary
No edit summary
Line 13: Line 13:
== <b>Implementation</b> ==
== <b>Implementation</b> ==
The Singleton pattern is implemented by <br>
The Singleton pattern is implemented by <br>
- Create a class with a method which will create a new instance of the class (If one doesn't already exist)<br>
- Creating a class with a method which will create a new instance of the class (If one doesn't already exist)<br>
- The constructor of this class is turned to private or protected<br>
- The constructor of this class is turned to private or protected<br>
- Another public function is used to call this constructor.<br>  
- Another public function is used to call this constructor.<br>  

Revision as of 00:18, 2 October 2007

Take a case of the Singleton pattern and implement it as succinctly as possible in Ruby and Java. Compare the two implementations in terms of clarity and succinctness. The example should be a "real-world" example. While it may be grossly oversimplified for the purpose of illustration, it should not be totally contrived.


Singleton Pattern

The Singleton pattern is a design pattern used to insure the existence of a single instance of a class in the run time. It constructs the object once and returns a reference to this object every time thereafter. In a multithreading environment, special care should be taken, as it will be illustrated later in this page.

Global Variables versus Singleton

Singletons are often mistaken as global variables. These two are very similar but the main difference between the two is that the Singleton Pattern deals with how to limit instances, while global variables deal with how programmers declare instances. Singletons are frequently mistaken by programmers that are inexperienced because they usually think that the use of Singleton Pattern will solve problems that are associated with global variables.


Implementation

The Singleton pattern is implemented by
- Creating a class with a method which will create a new instance of the class (If one doesn't already exist)
- The constructor of this class is turned to private or protected
- Another public function is used to call this constructor.
- If the object is not initialized yet (object == null) it calls the constructor and returns a reference else it will just return a reference.

In multithreading environment, a synchronized command should be used so not every thread in the program can initialize its own instance of the singleton class.


Class Diagram


Example Implementations

To demonstrate further let us consider programs that implement a logger in Java and then in Ruby.


Java

public class LoggerSingleton {
  private static LoggerSingleton instance = null;
  private LoggerSingleton() {
     // Exists only to defeat instantiation.
  }
  public static LoggerSingleton getInstance() {
     if(instance == null) {
        instance = new LoggerSingleton();
     }
     return instance;
  }
  // add other attributes
}


Ruby

require 'singleton' 
class LoggerSingleton
  include Singleton 
end 


Test Singletons

The following coding is to test singleton class

Java

import junit.framework.Assert; 
import junit.framework.TestCase; 
public class TestSingleton extends TestCase {
 private LoggerSingleton logger1 = null, logger2 = null;
 public TestSingleton(String name) {
   super(name);
 }
 public void setUp() {
       logger1 = LoggerSingleton.getInstance();
       logger2 = LoggerSingleton.getInstance();
  }
 public void testUnique() {
       System.out.println(logger1);
       System.out.println(logger2);
       Assert.assertEquals(true, logger1 == logger2);
      }
   }

Ruby

def test_singleton
 class << OnlyOne.instance
   def reset
     # reset state
   end
 end
 OnlyOne.instance.modify_state
 OnlyOne.instance.reset
end


Java versus Ruby

Java and Ruby have their similarities and their differences so lets compare the two languages.


Ruby Java
Dynamically typed Statically typed
Purely object oriented Distinction between primitives and object types
No classes required, closures are good enough A class is required for each strategy implementation
Syntactic regular-expression support Not present
nil is an object => no null-pointer exceptions null means no reference to object
Possible to capture calls to non-existent methods using method_missing Not possible
All classes are open to extension Classes cannot be extended at run time
Reflection is easy Reflection is much more verbose
Blocks are closures Anonymous inner functions are closures but less powerful


Conclusion

Java doesn’t contain singleton pattern in the language itself, although implementation for the pattern is still possible. While in Ruby the singleton pattern is in the language itself, which became possible since Ruby is a dynamic language through singleton module.