//[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(); 
} 
 
 
            
       
  |