Java/Design Pattern/Prototype Pattern
Prototype pattern in Java
<source lang="java">
/* The Design Patterns Java Companion Copyright (C) 1998, by James W. Cooper IBM Thomas J. Watson Research Center
- /
import java.awt.Button; import java.awt.Color; import java.awt.Frame; import java.awt.GridLayout; import java.awt.List; import java.awt.Panel; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.RandomAccessFile; import java.io.Serializable; import java.util.StringTokenizer; import java.util.Vector; public class SwimInfo extends Frame implements ActionListener {
SwimData sdata, sxdata = null; List swList, cloneList; Button Clone, Refresh, Quit; Swimmer sw; public SwimInfo() { super("Prototype example"); sdata = new SwimData("swimmers.txt"); setGUI(); loadswList(); } //- public void actionPerformed(ActionEvent e) { Object obj = e.getSource(); if (obj == Clone) cloneAndLoad(); if (obj == Refresh) loadswList(); if (obj == Quit) System.exit(0); } //- private void cloneAndLoad() { //sxdata = (SwimData)sdata.deepClone(); sxdata = (SwimData) sdata.clone(); sxdata.sortByTime(); cloneList.removeAll(); //now print out sorted values from clone for (int i = 0; i < sxdata.size(); i++) { sw = sxdata.getSwimmer(i); cloneList.addItem(sw.getName() + " " + sw.getTime()); } } //- private void loadswList() { swList.removeAll(); for (int i = 0; i < sdata.size(); i++) { sw = sdata.getSwimmer(i); swList.addItem(sw.getName() + " " + sw.getTime()); } } //- private void setGUI() { setLayout(new GridLayout(1, 3)); setBackground(Color.lightGray); swList = new List(15); cloneList = new List(15); Panel cp = new Panel(); add(swList); add(cp); add(cloneList); Clone = new Button("Clone >"); Refresh = new Button("<Refresh"); Quit = new Button("Quit"); cp.setLayout(new GridLayout(3, 1)); Panel p1 = new Panel(); cp.add(p1); p1.add(Clone); Panel p2 = new Panel(); cp.add(p2); p2.add(Refresh); Panel p3 = new Panel(); cp.add(p3); p3.add(Quit); Clone.addActionListener(this); Refresh.addActionListener(this); Quit.addActionListener(this); setBounds(100, 100, 500, 400); setVisible(true); } //- static public void main(String argv[]) { new SwimInfo(); }
} class SwimmerNoSex extends SwimData {
public SwimmerNoSex(String fileName) { super(fileName); } public void sortByTime() { }
} class SwimData implements Cloneable, Serializable {
protected Vector swimmers; public SwimData(String filename) { String s = ""; swimmers = new Vector(); InputFile f = new InputFile(filename); s = f.readLine(); while (s != null) { swimmers.addElement(new Swimmer(s)); s = f.readLine(); } f.close(); } public int size() { return swimmers.size(); } public Swimmer getSwimmer(int i) { if ((i >= 0) && (i < swimmers.size())) return (Swimmer) swimmers.elementAt(i); else return null; } public void sortByTime() { Swimmer sw; int i, j; int max = swimmers.size(); Swimmer sd[] = new Swimmer[max]; for (i = 0; i < max; i++) sd[i] = (Swimmer) swimmers.elementAt(i); for (i = 0; i < max; i++) { for (j = i; j < max; j++) { if (sd[i].getTime() > sd[j].getTime()) { sw = sd[i]; sd[i] = sd[j]; sd[j] = sw; } } } // swimmers = new Vector(); swimmers.removeAllElements(); for (i = 0; i < max; i++) swimmers.addElement(sd[i]); } public Object deepClone() { try { ByteArrayOutputStream b = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(b); out.writeObject(this); ByteArrayInputStream bIn = new ByteArrayInputStream(b.toByteArray()); ObjectInputStream oi = new ObjectInputStream(bIn); return (oi.readObject()); } catch (Exception e) { System.out.println("exception:" + e.getMessage()); e.printStackTrace(); return null; } } public Object clone() { try { return super.clone(); } catch (Exception e) { System.out.println(e.getMessage()); return null; } }
} //============================================== class Swimmer implements Serializable {
String name; int age; String club; float time; boolean female; public Swimmer(String dataline) { StringTokenizer st = new StringTokenizer(dataline, ","); name = st.nextToken(); age = new Integer(st.nextToken().trim()).intValue(); club = st.nextToken().trim(); time = new Float(st.nextToken().trim()).floatValue(); //System.out.println(name+" "+time); String sx = st.nextToken().trim().toUpperCase(); female = sx.equals("F"); } public boolean isFemale() { return female; } public int getAge() { return age; } public float getTime() { return time; } public String getName() { return name; } public String getClub() { return club; }
} class InputFile {
RandomAccessFile f = null; boolean errflag; String s = null; public InputFile(String fname) { errflag = false; try { //open file f = new RandomAccessFile(fname, "r"); } catch (IOException e) { //print error if not found System.out.println("no file found"); errflag = true; //and set flag } } public boolean checkErr() { return errflag; } public String read() { //read a single field up to a comma or end of line String ret = ""; if (s == null) //if no data in string { s = readLine(); //read next line } if (s != null) //if there is data { s.trim(); //trim off blanks int i = s.indexOf(","); //find next comma if (i <= 0) { ret = s.trim(); //if no commas go to end of line s = null; //and null out stored string } else { ret = s.substring(0, i).trim(); //return left of comma s = s.substring(i + 1); //save right of comma } } else ret = null; return ret; //return string } public String readLine() { //read in a line from the file s = null; try { s = f.readLine(); //could throw error } catch (IOException e) { errflag = true; System.out.println("File read error"); } return s; } public void close() { try { f.close(); //close file } catch (IOException e) { System.out.println("File close error"); errflag = true; } }
} //Swimmers.txt /* Kristen Frost, 9, CAT, 26.31, F Kimberly Watcke, 10, CDEV,27.37, F Jaclyn Carey, 10, ARAC, 27.53, F Megan Crapster, 10, LEHY, 27.68, F Kaitlyn Ament, 10, HNHS, 28.20, F Jackie Rogers, 10, WCA, 28.68, F Erin McLaughlin, 9, HMST, 28.80, F Emily Ferrier, 10, NMIL, 28.85, F Aurora Lee, 8, FFLY, 28.88, F Kate Isselee, 9, NMIL, 28.91, F Luke Mester, 10, GYWD, 24.88, M Stephen Cosme, 9, OAK, 27.89, M Jeffrey Sudbury, 10, WYW, 28.24, M Ernest Verrico, 9, SHKS, 28.46, M David Liebovitz, 10, WYW, 28.78, M Ryan Rynazewski, 10, AJSC, 28.83, M Matthew Donch, 9, PSDY, 28.95, M Christopher Prus, 10, RAYS, 29.02, M Charles Baker, 10, PSDY, 29.06, M Matthew Sweitzer, 10, SHKS, 29.10, M
- /
</source>
Prototype Pattern in Java 2
<source lang="java">
//[C] 2002 Sun Microsystems, Inc.---
public class RunPrototypePattern {
public static void main(String[] arguments) { System.out.println("Example for Prototype pattern"); System.out.println(); System.out.println("This example will create an Address object,"); System.out.println(" which it will then duplicate by calling the"); System.out.println(" object"s clone method."); System.out.println(); System.out.println("Creating first address."); Address address1 = new Address("8445 Silverado Trail", "Rutherford", "CA", "91734"); System.out.println("First address created."); System.out.println(" Hash code = " + address1.hashCode()); System.out.println(address1); System.out.println(); System.out.println("Creating second address using the clone() method."); Address address2 = (Address) address1.copy(); System.out.println("Second address created."); System.out.println(" Hash code = " + address2.hashCode()); System.out.println(address2); System.out.println(); }
} interface Copyable {
public Object copy();
} class Address implements Copyable {
private String type; private String street; private String city; private String state; private String zipCode; public static final String EOL_STRING = System .getProperty("line.separator"); public static final String COMMA = ","; public static final String HOME = "home"; public static final String WORK = "work"; public Address(String initType, String initStreet, String initCity, String initState, String initZip) { type = initType; street = initStreet; city = initCity; state = initState; zipCode = initZip; } public Address(String initStreet, String initCity, String initState, String initZip) { this(WORK, initStreet, initCity, initState, initZip); } public Address(String initType) { type = initType; } public Address() { } public String getType() { return type; } 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 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 Object copy() { return new Address(street, city, state, zipCode); } public String toString() { return "\t" + street + COMMA + " " + EOL_STRING + "\t" + city + COMMA + " " + state + " " + zipCode; }
}
</source>