Abstract Factory Pattern- Example : Factory Pattern « Design Pattern « Java






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



           
       








Related examples in the same category

1.Abstract Factory Pattern in Java 2
2.Factory Method Pattern in Java
3.Illustrates use of Abstract Factory patternIllustrates use of Abstract Factory pattern
4.Fly weight FactoryFly weight Factory