Java/Design Pattern/FlightWeight Pattern
Flyweight Pattern in Java
//[C] 2002 Sun Microsystems, Inc.---
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
public class RunFlyweightPattern {
public static void main(String [] arguments) throws java.io.IOException{
System.out.println("Example for the Flyweight pattern");
System.out.println();
System.out.println("In this sample, State objects are shared between multiple");
System.out.println(" parts of the PIM. Two lists, representing a Contact list");
System.out.println(" and an Address Book, are used for the demonstration.");
System.out.println(" The State objects - CleanState and DirtyState - represent");
System.out.println(" the Flyweight objects in this example.");
System.out.println();
System.out.println("Creating ManagedList objects to hold Contacts and Addresses");
ManagedList contactList = new ManagedList(Contact.class);
ManagedList addressList = new ManagedList(Address.class);
System.out.println();
System.out.println("Printing the State for the application");
printPIMState();
System.out.println();
System.out.println("Editing the Address and Contact lists");
StateFactory.getCurrentState().edit(State.CONTACTS);
StateFactory.getCurrentState().edit(State.ADDRESSES);
contactList.addItem(new ContactImpl("f", "l", "t", "o"));
addressList.addItem(new AddressImpl("d", "s", "c", "st", "z"));
System.out.println("Printing the State for the application");
printPIMState();
System.out.println();
System.out.println("Saving the Contact list");
StateFactory.getCurrentState().save(new java.io.File("contacts.ser"), contactList.getItems(), State.CONTACTS);
System.out.println("Printing the State for the application");
printPIMState();
System.out.println();
System.out.println("Saving the Address list");
StateFactory.getCurrentState().save(new java.io.File("addresses.ser"), addressList.getItems(), State.ADDRESSES);
System.out.println("Printing the State for the application");
printPIMState();
}
private static void printPIMState(){
System.out.println(" Current State of the PIM: " + StateFactory.getCurrentState().getClass());
System.out.println(" Object ID: " + StateFactory.getCurrentState().hashCode());
System.out.println();
}
}
interface State{
public static final int CONTACTS = 1;
public static final int ADDRESSES = 2;
public static final int MAXIMUM_STATE_VALUE = 2;
public void save(File f, Serializable s, int type) throws IOException;
public void edit(int type);
}
class StateFactory {
public static final State CLEAN = new CleanState();
public static final State DIRTY = new DirtyState();
private static State currentState = CLEAN;
public static State getCurrentState(){
return currentState;
}
public static void setCurrentState(State state){
currentState = state;
}
}
class CleanState implements State{
public void save(File file, Serializable s, int type) throws IOException{ }
public void edit(int type){
StateFactory.setCurrentState(StateFactory.DIRTY);
((DirtyState)StateFactory.DIRTY).incrementStateValue(type);
}
}
class DirtyState implements State{
private int stateFlags;
public void save(File file, Serializable data, int stateType) throws IOException{
FileOutputStream fos = new FileOutputStream(file);
ObjectOutputStream out = new ObjectOutputStream(fos);
out.writeObject(data);
decrementStateValue(stateType);
if (stateFlags == 0){
StateFactory.setCurrentState(StateFactory.CLEAN);
}
}
public void edit(int type){
incrementStateValue(type);
}
public void incrementStateValue(int stateType){
if ((stateType > 0) && (stateType <= MAXIMUM_STATE_VALUE)){
stateFlags = stateFlags | stateType;
}
}
public void decrementStateValue(int stateType){
if ((stateType > 0) && (stateType <= MAXIMUM_STATE_VALUE)){
stateFlags = stateFlags ^ stateType;
}
}
}
interface Address extends Serializable{
public static final String EOL_STRING = System.getProperty("line.separator");
public static final String SPACE = " ";
public static final String COMMA = ",";
public String getType();
public String getDescription();
public String getStreet();
public String getCity();
public String getState();
public String getZipCode();
public void setType(String newType);
public void setDescription(String newDescription);
public void setStreet(String newStreet);
public void setCity(String newCity);
public void setState(String newState);
public void setZipCode(String newZip);
}
class AddressImpl implements Address{
private String type;
private String description;
private String street;
private String city;
private String state;
private String zipCode;
public static final String HOME = "home";
public static final String WORK = "work";
public AddressImpl(){ }
public AddressImpl(String newDescription, String newStreet,
String newCity, String newState, String newZipCode){
description = newDescription;
street = newStreet;
city = newCity;
state = newState;
zipCode = newZipCode;
}
public String getType(){ return type; }
public String getDescription(){ return description; }
public String getStreet(){ return street; }
public String getCity(){ return city; }
public String getState(){ return state; }
public String getZipCode(){ return zipCode; }
public void setType(String newType){ type = newType; }
public void setDescription(String newDescription){ description = newDescription; }
public void setStreet(String newStreet){ street = newStreet; }
public void setCity(String newCity){ city = newCity; }
public void setState(String newState){ state = newState; }
public void setZipCode(String newZip){ zipCode = newZip; }
public String toString(){
return street + EOL_STRING + city + COMMA + SPACE +
state + SPACE + zipCode + EOL_STRING;
}
}
interface Contact extends Serializable{
public static final String SPACE = " ";
public String getFirstName();
public String getLastName();
public String getTitle();
public String getOrganization();
public void setFirstName(String newFirstName);
public void setLastName(String newLastName);
public void setTitle(String newTitle);
public void setOrganization(String newOrganization);
}
class ContactImpl implements Contact{
private String firstName;
private String lastName;
private String title;
private String organization;
public ContactImpl(){}
public ContactImpl(String newFirstName, String newLastName,
String newTitle, String newOrganization){
firstName = newFirstName;
lastName = newLastName;
title = newTitle;
organization = newOrganization;
}
public String getFirstName(){ return firstName; }
public String getLastName(){ return lastName; }
public String getTitle(){ return title; }
public String getOrganization(){ return organization; }
public void setFirstName(String newFirstName){ firstName = newFirstName; }
public void setLastName(String newLastName){ lastName = newLastName; }
public void setTitle(String newTitle){ title = newTitle; }
public void setOrganization(String newOrganization){ organization = newOrganization; }
public String toString(){
return firstName + SPACE + lastName;
}
}
class ManagedList{
private ArrayList elements = new ArrayList();
private Class classType;
public ManagedList(){ }
public ManagedList(Class newClassType){
classType = newClassType;
}
public void setClassType(Class newClassType){
classType = newClassType;
}
public void addItem(Object item){
if ((item != null) && (classType.isInstance(item))){
elements.add(item);
} else {
elements.add(item);
}
}
public void removeItem(Object item){
elements.remove(item);
}
public ArrayList getItems(){
return elements;
}
}