Illustrates use of Abstract Factory pattern : Factory Pattern « Design Pattern « Java






Illustrates use of Abstract Factory pattern

Illustrates use of Abstract Factory pattern
/*
The Design Patterns Java Companion

Copyright (C) 1998, by James W. Cooper

IBM Thomas J. Watson Research Center

*/

import java.awt.Button;
import java.awt.Checkbox;
import java.awt.CheckboxGroup;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

public class Gardener extends Frame implements ActionListener, ItemListener {
  private Checkbox Vegie, Annual, Peren;

  private Button Center, Border, Shade, Quit;

  private Garden garden = null;

  private GardenPanel gardenPlot;

  private String borderPlant = "", centerPlant = "", shadePlant = "";

  public Gardener() {
    super("Garden planner");
    setGUI();
  }

  //----------------------------------
  private void setGUI() {
    setBackground(Color.lightGray);
    setLayout(new GridLayout(1, 2));
    Panel left = new Panel();
    add(left);
    Panel right = new Panel();
    add(right);

    //create label and 3 radio buttons on left side
    left.setLayout(new GridLayout(4, 1));
    left.add(new Label("Garden type"));
    CheckboxGroup grp = new CheckboxGroup();
    Vegie = new Checkbox("Vegetable", grp, false);
    Annual = new Checkbox("Annual", grp, false);
    Peren = new Checkbox("Perennial", grp, false);
    left.add(Vegie);
    left.add(Annual);
    left.add(Peren);
    Vegie.addItemListener(this);
    Peren.addItemListener(this);
    Annual.addItemListener(this);

    //now create right side
    right.setLayout(new GridLayout(2, 1));
    gardenPlot = new GardenPanel();
    gardenPlot.setBackground(Color.white);
    Panel botRight = new Panel();

    right.add(gardenPlot);
    right.add(botRight);
    Center = new Button("Central");
    Border = new Button("Border");
    Shade = new Button("Shade");
    Quit = new Button("Quit");
    botRight.add(Center);
    Center.addActionListener(this);
    botRight.add(Border);
    Border.addActionListener(this);
    botRight.add(Shade);
    Shade.addActionListener(this);
    botRight.add(Quit);
    Quit.addActionListener(this);
    setBounds(200, 200, 400, 300);
    setVisible(true);

  }

  //----------------------------------
  public void actionPerformed(ActionEvent e) {
    Object obj = e.getSource();
    if (obj == Center)
      setCenter();
    if (obj == Border)
      setBorder();
    if (obj == Shade)
      setShade();
    if (obj == Quit)
      System.exit(0);
  }

  //----------------------------------
  private void setCenter() {
    if (garden != null)
      centerPlant = garden.getCenter().getName();
    gardenPlot.repaint();
  }

  private void setBorder() {
    if (garden != null)
      borderPlant = garden.getBorder().getName();
    gardenPlot.repaint();
  }

  private void setShade() {
    if (garden != null)
      shadePlant = garden.getShade().getName();
    gardenPlot.repaint();
  }

  //----------------------------------
  public void itemStateChanged(ItemEvent e) {
    Checkbox ck = (Checkbox) e.getSource();
    garden = new GardenMaker().getGarden(ck.getLabel());
    shadePlant = "";
    centerPlant = "";
    borderPlant = "";
    gardenPlot.repaint();
  }

  //----------------------------------
  static public void main(String argv[]) {
    new Gardener();
  }

  //--------------------------------
  class GardenPanel extends Panel {
    public void paint(Graphics g) {
      Dimension sz = getSize();
      g.setColor(Color.lightGray);
      g.fillArc(0, 0, 80, 80, 0, 360);
      g.setColor(Color.black);
      g.drawRect(0, 0, sz.width - 1, sz.height - 1);
      g.drawString(centerPlant, 100, 50);
      g.drawString(borderPlant, 75, 120);
      g.drawString(shadePlant, 10, 40);
    }
  }
} //end of Gardener class
//=============================================

class GardenMaker {
  //Abstract Factory which returns one of three gardens
  private Garden gd;

  public Garden getGarden(String gtype) {
    gd = new VegieGarden(); //default
    if (gtype.equals("Perennial"))
      gd = new PerennialGarden();
    if (gtype.equals("Annual"))
      gd = new AnnualGarden();
    return gd;
  }

}

abstract class Garden {
  public abstract Plant getShade();

  public abstract Plant getCenter();

  public abstract Plant getBorder();
}

class Plant {
  String name;

  public Plant(String pname) {
    name = pname; //save name
  }

  public String getName() {
    return name;
  }
}

class VegieGarden extends Garden {
  public Plant getShade() {
    return new Plant("Broccoli");
  }

  public Plant getCenter() {
    return new Plant("Corn");
  }

  public Plant getBorder() {
    return new Plant("Peas");
  }

}

class AnnualGarden extends Garden {
  public Plant getShade() {
    return new Plant("Coleus");
  }

  public Plant getCenter() {
    return new Plant("Marigold");
  }

  public Plant getBorder() {
    return new Plant("Alyssum");
  }

}

class PerennialGarden extends Garden
{
   public Plant getShade()
   {
      return new Plant("Astilbe");
   }
 public Plant getCenter()
 {
    return new Plant("Dicentrum");
 }
 public Plant getBorder()
 {
    return new Plant("Sedum");
 }

}


           
       








Related examples in the same category

1.Abstract Factory Pattern- Example
2.Abstract Factory Pattern in Java 2
3.Factory Method Pattern in Java
4.Fly weight FactoryFly weight Factory