Tuesday, 9 January 2018

Factory Method Design Pattern


Intent

Define an interface for creating an object, but let sub classes decide which class to instantiate. Factory Method lets a class defer instantiate to sub classes.

Also Known as

Virtual Constructor

                               Applicability

                                   Use the Factory Method pattern when

· a class can't anticipate the class of objects it must create.

· a class wants its sub classes to specify the objects it creates.

· classes delegate responsibility to one of several helper sub classes, and

you want to localize the knowledge of which helper subclass is the delegate.

                                         Structure



Participant

  

  Product (Document)

o defines the interface of objects the factory method creates.

· Concrete Product (My Document)

o implements the Product interface.

· Creator (Application)

o declares the factory method, which returns an object of type Product.
Creator may also define a default implementation of the factory
method that returns a default Concrete Product object.

o may call the factory method to create a Product object.

· Concrete Creator (My Application)

o overrides the factory method to return an instance of a
Concrete Product.

 Related Pattern

Abstract Factory.
Template.
Prototypes.

Class Diagram

Program

====================Interface for creating  product===========
package LangageCountry;

/**
 *
 * @author Sonu
 */
public interface Country {
    String  curruncy();
    String date();
    String percentage();
}


===================concrete class ====================

package LangageCountry;

import java.text.DateFormat;
import java.util.Currency;
import java.util.Date;
import java.util.Locale;
import javax.swing.JOptionPane;


/**
 *
 * @author Sonu
 */
public class INDIA implements Country{

    @Override
    public String curruncy()
    {  

          Currency c=Currency.getInstance(Locale.ITALY); // at this place you can use Locale.india
          return ""+c;
    }
    @Override
    public String date()
    {
        Date date = new Date();
         DateFormat df = DateFormat.getDateInstance(1,Locale.ITALY);
        String str= df.format(date);
          return ""+str;
    }

    @Override
    public String percentage() {
        return "percentage of india";
    }
}

====================Concrete class ====================

package LangageCountry;

import java.text.DateFormat;
import java.util.Currency;
import java.util.Date;
import java.util.Locale;
import javax.swing.JOptionPane;

/**
 *
 * @author Sonu
 */
 class JAPAN implements Country{

    @Override
    public String  curruncy() {
       
        Currency c = Currency.getInstance(Locale.JAPAN);
        return ""+c;
    }

    @Override
    public String date() {
       Date d = new Date();
        DateFormat df = DateFormat.getDateInstance(1,Locale.JAPAN);
        String str=df.format(d);
       return ""+str;
    }

    @Override
    public String percentage() {  
    return "Parcentage of japan";
    }
   
}

====================Concrete class ====================

package LangageCountry;

import java.text.DateFormat;
import java.time.Instant;
import java.util.Currency;
import java.util.Date;
import java.util.Locale;
import javax.swing.JOptionPane;

/**
 *
 * @author Sonu
 */
 class USA implements Country{
    @Override
    public String  curruncy() {
        Currency c = Currency.getInstance(Locale.US);
        return ""+c;
    }
    @Override
    public String  date() {
      
      Date date = new Date();
      DateFormat d=DateFormat.getDateInstance(1,Locale.US);
        String s=d.format(date);
        return ""+s;
    }

    @Override
    public String percentage() {
        return "Percentage of usa";
    }
}

=================The main class =======================

package LangageCountry;

import java.util.Scanner;


/**
 *
 * @author Sonu
 */
public class CreateCountry {
    public static void main(String []args)
    {
        System.out.println("Enter Number 1 for India");
        System.out.println("Enter Number 2 for Japan");
        System.out.println("Enter Number 3 for Usa");
        Scanner s = new Scanner(System.in);
        int i= s.nextInt();
        Country c = CountryFactory.getCountry(i);
        System.out.println("Curruncy : " + c.curruncy());
        System.out.println("Date : " + c.date());
        System.out.println("Precentage:"+c.percentage());
    }  
}

==================== output =========================

Output