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 17: Line 17:




public class LoggerSingleton {
public class LoggerSingleton {
   private static LoggerSingleton instance = null;
   private static LoggerSingleton instance = null;
   private LoggerSingleton() {
   private LoggerSingleton() {
Line 35: Line 35:


<b>Ruby</b>  
<b>Ruby</b>  


require 'singleton'  
require 'singleton'  
class LoggerSingleton
class LoggerSingleton
   include Singleton  
   include Singleton  
end  
end  


Line 49: Line 48:




import junit.framework.Assert;  
import junit.framework.Assert;  
import junit.framework.TestCase;  
import junit.framework.TestCase;  


public class TestSingleton extends TestCase {
public class TestSingleton extends TestCase {
   private LoggerSingleton logger1 = null, logger2 = null;
   private LoggerSingleton logger1 = null, logger2 = null;
   public TestSingleton(String name) {
   public TestSingleton(String name) {
Line 70: Line 69:
<b>in ruby;</b>
<b>in ruby;</b>


def test_singleton
def test_singleton
   class << OnlyOne.instance
   class << OnlyOne.instance
     def reset
     def reset
Line 79: Line 78:
   OnlyOne.instance.modify_state
   OnlyOne.instance.modify_state
   OnlyOne.instance.reset
   OnlyOne.instance.reset
end
end





Revision as of 16:32, 1 October 2007

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.


Implementation

- The constructor of this class is turned to private.
- 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.

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

Following a code to test singleton class in 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);

 }

}

in ruby;

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



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.