Fly weight Factory : Factory Pattern « Design Pattern « Java





Fly weight Factory

Fly weight Factory
/*
Software Architecture Design Patterns in Java
by Partha Kuchana 

Auerbach Publications

*/


import java.util.HashMap;
import java.util.StringTokenizer;
import java.util.Vector;

public class FlyweightTest {

  public static void main(String[] args) throws Exception {
    Vector empList = initialize();
    FlyweightFactory factory = FlyweightFactory.getInstance();

    for (int i = 0; i < empList.size(); i++) {
      String s = (String) empList.elementAt(i);
      StringTokenizer st = new StringTokenizer(s, ",");
      String name = st.nextToken();
      String title = st.nextToken();
      String division = st.nextToken();

      FlyweightIntr flyweight = factory.getFlyweight(division);
      //associate the flyweight
      //with the extrinsic data object.
      VCard card = new VCard(name, title, flyweight);
      card.print();
    }
  }

  private static Vector initialize() {
    //for simplicity values are being hardcoded.

    Vector v = new Vector();
    v.add("name1,title1,North");
    v.add("name2,title2,South");
    v.add("name3,title1,North");
    v.add("name4,title3,East");
    v.add("name5,title4,East");
    v.add("name6,title2,East");
    v.add("name7,title1,West");
    v.add("name8,title3,West");
    v.add("name9,title1,West");
    v.add("name10,title6,South");
    v.add("name11,title5,North");
    v.add("name12,title1,North");

    return v;
  }
}

class FlyweightFactory {
  private HashMap lstFlyweight;

  private static FlyweightFactory factory = new FlyweightFactory();

  private FlyweightFactory() {
    lstFlyweight = new HashMap();
  }

  public synchronized FlyweightIntr getFlyweight(String divisionName) {
    if (lstFlyweight.get(divisionName) == null) {
      FlyweightIntr fw = new Flyweight(divisionName);
      lstFlyweight.put(divisionName, fw);
      return fw;
    } else {
      return (FlyweightIntr) lstFlyweight.get(divisionName);
    }
  }

  public static FlyweightFactory getInstance() {
    return factory;
  }

  //Inner flyweight class
  private class Flyweight implements FlyweightIntr {
    private String company;

    private String address;

    private String city;

    private String state;

    private String zip;

    private void setValues(String cmp, String addr, String cty, String st,
        String zp) {

      company = cmp;
      address = addr;
      city = cty;
      state = st;
      zip = zp;

    }

    private Flyweight(String division) {
      // values are hard coded
      //for simplicity
      if (division.equals("North")) {
        setValues("CMP", "addr1", "cty1", "st1", "10000");
      }
      if (division.equals("South")) {
        setValues("CMP", "addr2", "cty2", "st2", "20000");
      }
      if (division.equals("East")) {
        setValues("CMP", "addr3", "cty3", "st3", "30000");
      }
      if (division.equals("West")) {
        setValues("CMP", "addr4", "cty4", "st4", "40000");
      }
    }

    public String getCompany() {
      return company;
    }

    public String getAddress() {
      return address;
    }

    public String getCity() {
      return city;
    }

    public String getState() {
      return state;
    }

    public String getZip() {
      return zip;
    }

  }// end of Flyweight
}// end of FlyweightFactory

interface FlyweightIntr {
  public String getCompany();

  public String getAddress();

  public String getCity();

  public String getState();

  public String getZip();
}

class VCard {

  String name;

  String title;

  FlyweightIntr objFW;

  public VCard(String n, String t, FlyweightIntr fw) {
    name = n;
    title = t;
    objFW = fw;
  }

  public void print() {
    System.out.println(name);
    System.out.println(title);
    System.out.println(objFW.getAddress() + "-" + objFW.getCity() + "-"
        + objFW.getState() + "-" + objFW.getZip());
    System.out.println("----------------");
  }

}

           
       










Related examples in the same category

1.Abstract Factory Pattern- Example
2.Abstract Factory Pattern in Java 2
3.Factory Method Pattern in Java
4.Illustrates use of Abstract Factory patternIllustrates use of Abstract Factory pattern