Design Pattern Java

/*
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