Mega Code Archive

 
Categories / Java / Design Pattern
 

Abstract Factory Pattern- Example

/* Software Architecture Design Patterns in Java by Partha Kuchana  Auerbach Publications */ import java.awt.BorderLayout; import java.awt.Container; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.SwingUtilities; import javax.swing.UIManager; import com.sun.java.swing.plaf.windows.WindowsLookAndFeel; public class AutoSearchUI extends JFrame {   public static final String newline = "\n";   public static final String SEARCH = "Search";   public static final String EXIT = "Exit";   public static final String CAR = "Car";   public static final String SUV = "SUV";   private JComboBox cmbVehicleCategory, cmbVehicleType;   private JLabel lblVehicleCategory, lblVehicleType, lblCarName,       lblCarNameValue;   public AutoSearchUI() {     super("Abstract Factory - Example");     cmbVehicleCategory = new JComboBox();     cmbVehicleCategory.addItem(VehicleFactory.LUXURY_VEHICLE);     cmbVehicleCategory.addItem(VehicleFactory.NON_LUXURY_VEHICLE);     cmbVehicleType = new JComboBox();     cmbVehicleType.addItem(AutoSearchUI.CAR);     cmbVehicleType.addItem(AutoSearchUI.SUV);     lblVehicleCategory = new JLabel("Vehicle Category:");     lblVehicleType = new JLabel("VehicleType:");     lblCarName = new JLabel("Search Result:");     lblCarNameValue = new JLabel(" Please click on Search button");     //Create the open button     JButton openButton = new JButton(AutoSearchUI.SEARCH);     openButton.setMnemonic(KeyEvent.VK_S);     JButton exitButton = new JButton(AutoSearchUI.EXIT);     exitButton.setMnemonic(KeyEvent.VK_X);     ButtonHandler objButtonHandler = new ButtonHandler(this);     openButton.addActionListener(objButtonHandler);     exitButton.addActionListener(new ButtonHandler());     JPanel buttonPanel = new JPanel();     //****************************************************     GridBagLayout gridbag = new GridBagLayout();     buttonPanel.setLayout(gridbag);     GridBagConstraints gbc = new GridBagConstraints();     buttonPanel.add(lblVehicleCategory);     buttonPanel.add(cmbVehicleCategory);     buttonPanel.add(lblVehicleType);     buttonPanel.add(cmbVehicleType);     buttonPanel.add(lblCarName);     buttonPanel.add(lblCarNameValue);     buttonPanel.add(openButton);     buttonPanel.add(exitButton);     gbc.insets.top = 5;     gbc.insets.bottom = 5;     gbc.insets.left = 5;     gbc.insets.right = 5;     gbc.anchor = GridBagConstraints.EAST;     gbc.gridx = 0;     gbc.gridy = 0;     gridbag.setConstraints(lblVehicleCategory, gbc);     gbc.anchor = GridBagConstraints.WEST;     gbc.gridx = 1;     gbc.gridy = 0;     gridbag.setConstraints(cmbVehicleCategory, gbc);     gbc.anchor = GridBagConstraints.EAST;     gbc.gridx = 0;     gbc.gridy = 1;     gridbag.setConstraints(lblVehicleType, gbc);     gbc.anchor = GridBagConstraints.WEST;     gbc.gridx = 1;     gbc.gridy = 1;     gridbag.setConstraints(cmbVehicleType, gbc);     gbc.anchor = GridBagConstraints.EAST;     gbc.gridx = 0;     gbc.gridy = 2;     gridbag.setConstraints(lblCarName, gbc);     gbc.anchor = GridBagConstraints.WEST;     gbc.gridx = 1;     gbc.gridy = 2;     gridbag.setConstraints(lblCarNameValue, gbc);     gbc.insets.left = 2;     gbc.insets.right = 2;     gbc.insets.top = 40;     gbc.anchor = GridBagConstraints.EAST;     gbc.gridx = 0;     gbc.gridy = 5;     gridbag.setConstraints(openButton, gbc);     gbc.anchor = GridBagConstraints.WEST;     gbc.gridx = 1;     gbc.gridy = 5;     gridbag.setConstraints(exitButton, gbc);     //****************************************************     //Add the buttons and the log to the frame     Container contentPane = getContentPane();     contentPane.add(buttonPanel, BorderLayout.CENTER);     try {       UIManager.setLookAndFeel(new WindowsLookAndFeel());       SwingUtilities.updateComponentTreeUI(AutoSearchUI.this);     } catch (Exception ex) {       System.out.println(ex);     }   }   public static void main(String[] args) {     JFrame frame = new AutoSearchUI();     frame.addWindowListener(new WindowAdapter() {       public void windowClosing(WindowEvent e) {         System.exit(0);       }     });     //frame.pack();     frame.setSize(400, 300);     frame.setVisible(true);   }   public String getSelectedCategory() {     return (String) cmbVehicleCategory.getSelectedItem();   }   public String getSelectedType() {     return (String) cmbVehicleType.getSelectedItem();   }   public void setResult(String searchResult) {     lblCarNameValue.setText(searchResult);   } } // End of class AutoSearchUI class ButtonHandler implements ActionListener {   AutoSearchUI objAutoSearchUI;   public void actionPerformed(ActionEvent e) {     String searchResult = null;     if (e.getActionCommand().equals(AutoSearchUI.EXIT)) {       System.exit(1);     }     if (e.getActionCommand().equals(AutoSearchUI.SEARCH)) {       //get input values       String vhCategory = objAutoSearchUI.getSelectedCategory();       String vhType = objAutoSearchUI.getSelectedType();       //get one of Luxury or NonLuxury vehicle factories       VehicleFactory vf = VehicleFactory.getVehicleFactory(vhCategory);       if (vhType.equals(AutoSearchUI.CAR)) {         Car c = vf.getCar();         searchResult = "Name: " + c.getCarName() + "  Features: "             + c.getCarFeatures();       }       if (vhType.equals(AutoSearchUI.SUV)) {         SUV s = vf.getSUV();         searchResult = "Name: " + s.getSUVName() + "  Features: "             + s.getSUVFeatures();       }       objAutoSearchUI.setResult(searchResult);     }   }   public ButtonHandler() {   }   public ButtonHandler(AutoSearchUI inObjAutoSearchUI) {     objAutoSearchUI = inObjAutoSearchUI;   } } // End of class ButtonHandler abstract class VehicleFactory {   public static final String LUXURY_VEHICLE = "Luxury";   public static final String NON_LUXURY_VEHICLE = "Non-Luxury";   public abstract Car getCar();   public abstract SUV getSUV();   public static VehicleFactory getVehicleFactory(String type) {     if (type.equals(VehicleFactory.LUXURY_VEHICLE))       return new LuxuryVehicleFactory();     if (type.equals(VehicleFactory.NON_LUXURY_VEHICLE))       return new NonLuxuryVehicleFactory();     return new LuxuryVehicleFactory();   } } // End of class interface Car {   public String getCarName();   public String getCarFeatures(); } // End of class interface SUV {   public String getSUVName();   public String getSUVFeatures(); } // End of class class LuxuryCar implements Car {   private String name;   public LuxuryCar(String cName) {     name = cName;   }   public String getCarName() {     return name;   }   public String getCarFeatures() {     return "Luxury Car Features ";   }; } // End of class class LuxurySUV implements SUV {   private String name;   public LuxurySUV(String sName) {     name = sName;   }   public String getSUVName() {     return name;   }   public String getSUVFeatures() {     return "Luxury SUV Features ";   }; } // End of class class LuxuryVehicleFactory extends VehicleFactory {   public Car getCar() {     return new LuxuryCar("L-C");   }   public SUV getSUV() {     return new LuxurySUV("L-S");   } } // End of class class NonLuxuryCar implements Car {   private String name;   public NonLuxuryCar(String cName) {     name = cName;   }   public String getCarName() {     return name;   }   public String getCarFeatures() {     return "Non-Luxury Car Features ";   }; } // End of class class NonLuxurySUV implements SUV {   private String name;   public NonLuxurySUV(String sName) {     name = sName;   }   public String getSUVName() {     return name;   }   public String getSUVFeatures() {     return "Non-Luxury SUV Features ";   }; } // End of class class NonLuxuryVehicleFactory extends VehicleFactory {   public Car getCar() {     return new NonLuxuryCar("NL-C");   }   public SUV getSUV() {     return new NonLuxurySUV("NL-S");   } } // End of class