Monday, July 21, 2014

Factory Method Implementation

Factory Method implementation:

// Define an interface that will be implemented by all sub-classes
interface Pet {
    public String speak();
}

// Create subclass
class Dog implements Pet {
    @Override
    public String speak() {
        return "Bark, bark";
    }
}

// Create subclass
class Duck implements Pet {
    @Override
    public String speak() {
        return "Quack, quack";
    }
}

// Creating a class that has Factory method
// to instatiate an object of subclass based on type
class PetFactory {
    public Pet getPet(String petType) {
        Pet pet = null;
       
        if("bark".equals(petType))
            pet = new Dog();
        else if("quack".equals(petType))
            pet = new Duck();
       
        return pet;
    }
}

public class FactoryMethodExample {
    public static void main(String[] args) {
        // Creating the factory
        PetFactory petFactory = new PetFactory();
       
        // Factory instantiate an object based on type
       
        // Note here, we are programming against an Interface
        Pet p = petFactory.getPet("bark");
       
        System.out.println(p.speak());
    }
}

Singleton Implementations

Singleton implementation:

// Singleton implementation - thread safe
class Singleton {


    // private static variable to hold the Object
    private static Singleton singleInstance = null;

  
    // fields
    private int i = 0;  

 
    // private constructor to prevent creating objects
    private Singleton() {    }
   
    // static method to create this object and to return
    public static Singleton getSingleInstance() {
      if (singleInstance == null) {
        synchronized (Singleton.class) {
          if (singleInstance == null) // 2-level checking
            singleInstance = new Singleton();      
        } // Synchronized(Singleton.class)
      }
      return singleInstance;
    }
   
    // Class methods
    public void Message() {
        i++;
        System.out.println("Singleton example: " + i);
    }
}

public class SingletonThreadsafe {
    public static void main(String[] args) {
        Singleton oneInstance = Singleton.getSingleInstance();
        oneInstance.Message(); // Singleton example: 1
       
        Singleton secondInstance = Singleton.getSingleInstance();
        secondInstance.Message(); // Singleton example: 2
    }
}


Singleton implementation using Enum:

enum MySingleton
{
    RAGHU;
    public void sayHello()
    {
        System.out.println("Hello Raghu!");
    }
   
    public void sayBye()
    {
        System.out.println("Bye Raghu!");
    }
}


public class SingletonUsingEnum {
    public static void main(String[] args)
    {
        MySingleton ms = MySingleton.RAGHU;
        ms.sayHello();
        ms.sayBye();
        MySingleton ms1 = MySingleton.RAGHU;
       
        if(ms == ms1)
            System.out.println("Referring to same singleton class");
    }
}