| //[C] 2002 Sun Microsystems, Inc.---
 import java.awt.Container;
 import java.awt.GridLayout;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
 import java.io.Serializable;
 
 import javax.swing.BoxLayout;
 import javax.swing.JButton;
 import javax.swing.JComponent;
 import javax.swing.JFrame;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
 import javax.swing.JTextArea;
 import javax.swing.JTextField;
 
 
 public class RunFactoryMethodPattern {
 public static void main(String [] arguments){
 System.out.println("Example for the FactoryMethod pattern");
 System.out.println();
 
 System.out.println("Creating a Contact object");
 System.out.println();
 Contact someone = new Contact();
 
 System.out.println("Creating a GUI editor for the Contact");
 System.out.println();
 System.out.println("The GUI defined in the EditorGui class is a truly generic editor.");
 System.out.println("It accepts an argument of type ItemEditor, and delegates");
 System.out.println(" all editing tasks to its ItemEditor and the associated GUI.");
 System.out.println(" The getEditor() Factory Method is used to obtain the ItemEditor");
 System.out.println(" for the example.");
 System.out.println();
 System.out.println("Notice that the editor in the top portion of the GUI is,");
 System.out.println(" in fact, returned by the ItemEditor belonging to the");
 System.out.println(" Contact class, and has appropriate fields for that class.");
 
 EditorGui runner = new EditorGui(someone.getEditor());
 runner.createGui();
 }
 }
 class EditorGui implements ActionListener{
 private JFrame mainFrame;
 private JTextArea display;
 private JButton update, exit;
 private JPanel controlPanel, displayPanel, editorPanel;
 private ItemEditor editor;
 
 public EditorGui(ItemEditor edit){
 editor = edit;
 }
 
 public void createGui(){
 mainFrame = new JFrame("Factory Pattern Example");
 Container content = mainFrame.getContentPane();
 content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));
 
 editorPanel = new JPanel();
 editorPanel.add(editor.getGUI());
 content.add(editorPanel);
 
 displayPanel = new JPanel();
 display = new JTextArea(10, 40);
 display.setEditable(false);
 displayPanel.add(display);
 content.add(displayPanel);
 
 controlPanel = new JPanel();
 update = new JButton("Update Item");
 exit = new JButton("Exit");
 controlPanel.add(update);
 controlPanel.add(exit);
 content.add(controlPanel);
 
 update.addActionListener(this);
 exit.addActionListener(this);
 
 mainFrame.addWindowListener(new WindowCloseManager());
 mainFrame.pack();
 mainFrame.setVisible(true);
 }
 
 
 public void actionPerformed(ActionEvent evt){
 Object originator = evt.getSource();
 if (originator == update){
 updateItem();
 }
 else if (originator == exit){
 exitApplication();
 }
 }
 
 private class WindowCloseManager extends WindowAdapter{
 public void windowClosing(WindowEvent evt){
 exitApplication();
 }
 }
 
 private void updateItem(){
 editor.commitChanges();
 display.setText(editor.toString());
 }
 
 private void exitApplication(){
 System.exit(0);
 }
 }
 
 class Contact implements Editable, Serializable {
 private String name;
 private String relationship;
 
 public ItemEditor getEditor() {
 return new ContactEditor();
 }
 
 private class ContactEditor implements ItemEditor, Serializable {
 private transient JPanel panel;
 private transient JTextField nameField;
 private transient JTextField relationField;
 
 public JComponent getGUI() {
 if (panel == null) {
 panel = new JPanel();
 nameField = new JTextField(name);
 relationField = new JTextField(relationship);
 panel.setLayout(new GridLayout(2,2));
 panel.add(new JLabel("Name:"));
 panel.add(nameField);
 panel.add(new JLabel("Relationship:"));
 panel.add(relationField);
 } else {
 nameField.setText(name);
 relationField.setText(relationship);
 }
 return panel;
 }
 
 public void commitChanges() {
 if (panel != null) {
 name = nameField.getText();
 relationship = relationField.getText();
 }
 }
 
 public String toString(){
 return "\nContact:\n" +
 "    Name: " + name + "\n" +
 "    Relationship: " + relationship;
 }
 }
 }
 
 interface Editable {
 public ItemEditor getEditor();
 }
 
 interface ItemEditor {
 public JComponent getGUI();
 public void commitChanges();
 }
 
 
 
 
 |