<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FDesign_Pattern%2FFactory_Pattern</id>
		<title>Java/Design Pattern/Factory Pattern - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FDesign_Pattern%2FFactory_Pattern"/>
		<link rel="alternate" type="text/html" href="http://jexp.ru/index.php?title=Java/Design_Pattern/Factory_Pattern&amp;action=history"/>
		<updated>2026-04-06T15:32:51Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://jexp.ru/index.php?title=Java/Design_Pattern/Factory_Pattern&amp;diff=7829&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://jexp.ru/index.php?title=Java/Design_Pattern/Factory_Pattern&amp;diff=7829&amp;oldid=prev"/>
				<updated>2010-06-01T06:51:00Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 06:51, 1 июня 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>http://jexp.ru/index.php?title=Java/Design_Pattern/Factory_Pattern&amp;diff=7828&amp;oldid=prev</id>
		<title> в 18:01, 31 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://jexp.ru/index.php?title=Java/Design_Pattern/Factory_Pattern&amp;diff=7828&amp;oldid=prev"/>
				<updated>2010-05-31T18:01:45Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Abstract Factory Pattern- Example ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Software Architecture Design Patterns in Java&lt;br /&gt;
by Partha Kuchana &lt;br /&gt;
Auerbach Publications&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
import java.awt.BorderLayout;&lt;br /&gt;
import java.awt.Container;&lt;br /&gt;
import java.awt.GridBagConstraints;&lt;br /&gt;
import java.awt.GridBagLayout;&lt;br /&gt;
import java.awt.event.ActionEvent;&lt;br /&gt;
import java.awt.event.ActionListener;&lt;br /&gt;
import java.awt.event.KeyEvent;&lt;br /&gt;
import java.awt.event.WindowAdapter;&lt;br /&gt;
import java.awt.event.WindowEvent;&lt;br /&gt;
import javax.swing.JButton;&lt;br /&gt;
import javax.swing.JComboBox;&lt;br /&gt;
import javax.swing.JFrame;&lt;br /&gt;
import javax.swing.JLabel;&lt;br /&gt;
import javax.swing.JPanel;&lt;br /&gt;
import javax.swing.SwingUtilities;&lt;br /&gt;
import javax.swing.UIManager;&lt;br /&gt;
import com.sun.java.swing.plaf.windows.WindowsLookAndFeel;&lt;br /&gt;
public class AutoSearchUI extends JFrame {&lt;br /&gt;
  public static final String newline = &amp;quot;\n&amp;quot;;&lt;br /&gt;
  public static final String SEARCH = &amp;quot;Search&amp;quot;;&lt;br /&gt;
  public static final String EXIT = &amp;quot;Exit&amp;quot;;&lt;br /&gt;
  public static final String CAR = &amp;quot;Car&amp;quot;;&lt;br /&gt;
  public static final String SUV = &amp;quot;SUV&amp;quot;;&lt;br /&gt;
  private JComboBox cmbVehicleCategory, cmbVehicleType;&lt;br /&gt;
  private JLabel lblVehicleCategory, lblVehicleType, lblCarName,&lt;br /&gt;
      lblCarNameValue;&lt;br /&gt;
  public AutoSearchUI() {&lt;br /&gt;
    super(&amp;quot;Abstract Factory - Example&amp;quot;);&lt;br /&gt;
    cmbVehicleCategory = new JComboBox();&lt;br /&gt;
    cmbVehicleCategory.addItem(VehicleFactory.LUXURY_VEHICLE);&lt;br /&gt;
    cmbVehicleCategory.addItem(VehicleFactory.NON_LUXURY_VEHICLE);&lt;br /&gt;
    cmbVehicleType = new JComboBox();&lt;br /&gt;
    cmbVehicleType.addItem(AutoSearchUI.CAR);&lt;br /&gt;
    cmbVehicleType.addItem(AutoSearchUI.SUV);&lt;br /&gt;
    lblVehicleCategory = new JLabel(&amp;quot;Vehicle Category:&amp;quot;);&lt;br /&gt;
    lblVehicleType = new JLabel(&amp;quot;VehicleType:&amp;quot;);&lt;br /&gt;
    lblCarName = new JLabel(&amp;quot;Search Result:&amp;quot;);&lt;br /&gt;
    lblCarNameValue = new JLabel(&amp;quot; Please click on Search button&amp;quot;);&lt;br /&gt;
    //Create the open button&lt;br /&gt;
    JButton openButton = new JButton(AutoSearchUI.SEARCH);&lt;br /&gt;
    openButton.setMnemonic(KeyEvent.VK_S);&lt;br /&gt;
    JButton exitButton = new JButton(AutoSearchUI.EXIT);&lt;br /&gt;
    exitButton.setMnemonic(KeyEvent.VK_X);&lt;br /&gt;
    ButtonHandler objButtonHandler = new ButtonHandler(this);&lt;br /&gt;
    openButton.addActionListener(objButtonHandler);&lt;br /&gt;
    exitButton.addActionListener(new ButtonHandler());&lt;br /&gt;
    JPanel buttonPanel = new JPanel();&lt;br /&gt;
    //****************************************************&lt;br /&gt;
    GridBagLayout gridbag = new GridBagLayout();&lt;br /&gt;
    buttonPanel.setLayout(gridbag);&lt;br /&gt;
    GridBagConstraints gbc = new GridBagConstraints();&lt;br /&gt;
    buttonPanel.add(lblVehicleCategory);&lt;br /&gt;
    buttonPanel.add(cmbVehicleCategory);&lt;br /&gt;
    buttonPanel.add(lblVehicleType);&lt;br /&gt;
    buttonPanel.add(cmbVehicleType);&lt;br /&gt;
    buttonPanel.add(lblCarName);&lt;br /&gt;
    buttonPanel.add(lblCarNameValue);&lt;br /&gt;
    buttonPanel.add(openButton);&lt;br /&gt;
    buttonPanel.add(exitButton);&lt;br /&gt;
    gbc.insets.top = 5;&lt;br /&gt;
    gbc.insets.bottom = 5;&lt;br /&gt;
    gbc.insets.left = 5;&lt;br /&gt;
    gbc.insets.right = 5;&lt;br /&gt;
    gbc.anchor = GridBagConstraints.EAST;&lt;br /&gt;
    gbc.gridx = 0;&lt;br /&gt;
    gbc.gridy = 0;&lt;br /&gt;
    gridbag.setConstraints(lblVehicleCategory, gbc);&lt;br /&gt;
    gbc.anchor = GridBagConstraints.WEST;&lt;br /&gt;
    gbc.gridx = 1;&lt;br /&gt;
    gbc.gridy = 0;&lt;br /&gt;
    gridbag.setConstraints(cmbVehicleCategory, gbc);&lt;br /&gt;
    gbc.anchor = GridBagConstraints.EAST;&lt;br /&gt;
    gbc.gridx = 0;&lt;br /&gt;
    gbc.gridy = 1;&lt;br /&gt;
    gridbag.setConstraints(lblVehicleType, gbc);&lt;br /&gt;
    gbc.anchor = GridBagConstraints.WEST;&lt;br /&gt;
    gbc.gridx = 1;&lt;br /&gt;
    gbc.gridy = 1;&lt;br /&gt;
    gridbag.setConstraints(cmbVehicleType, gbc);&lt;br /&gt;
    gbc.anchor = GridBagConstraints.EAST;&lt;br /&gt;
    gbc.gridx = 0;&lt;br /&gt;
    gbc.gridy = 2;&lt;br /&gt;
    gridbag.setConstraints(lblCarName, gbc);&lt;br /&gt;
    gbc.anchor = GridBagConstraints.WEST;&lt;br /&gt;
    gbc.gridx = 1;&lt;br /&gt;
    gbc.gridy = 2;&lt;br /&gt;
    gridbag.setConstraints(lblCarNameValue, gbc);&lt;br /&gt;
    gbc.insets.left = 2;&lt;br /&gt;
    gbc.insets.right = 2;&lt;br /&gt;
    gbc.insets.top = 40;&lt;br /&gt;
    gbc.anchor = GridBagConstraints.EAST;&lt;br /&gt;
    gbc.gridx = 0;&lt;br /&gt;
    gbc.gridy = 5;&lt;br /&gt;
    gridbag.setConstraints(openButton, gbc);&lt;br /&gt;
    gbc.anchor = GridBagConstraints.WEST;&lt;br /&gt;
    gbc.gridx = 1;&lt;br /&gt;
    gbc.gridy = 5;&lt;br /&gt;
    gridbag.setConstraints(exitButton, gbc);&lt;br /&gt;
    //****************************************************&lt;br /&gt;
    //Add the buttons and the log to the frame&lt;br /&gt;
    Container contentPane = getContentPane();&lt;br /&gt;
    contentPane.add(buttonPanel, BorderLayout.CENTER);&lt;br /&gt;
    try {&lt;br /&gt;
      UIManager.setLookAndFeel(new WindowsLookAndFeel());&lt;br /&gt;
      SwingUtilities.updateComponentTreeUI(AutoSearchUI.this);&lt;br /&gt;
    } catch (Exception ex) {&lt;br /&gt;
      System.out.println(ex);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    JFrame frame = new AutoSearchUI();&lt;br /&gt;
    frame.addWindowListener(new WindowAdapter() {&lt;br /&gt;
      public void windowClosing(WindowEvent e) {&lt;br /&gt;
        System.exit(0);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
    //frame.pack();&lt;br /&gt;
    frame.setSize(400, 300);&lt;br /&gt;
    frame.setVisible(true);&lt;br /&gt;
  }&lt;br /&gt;
  public String getSelectedCategory() {&lt;br /&gt;
    return (String) cmbVehicleCategory.getSelectedItem();&lt;br /&gt;
  }&lt;br /&gt;
  public String getSelectedType() {&lt;br /&gt;
    return (String) cmbVehicleType.getSelectedItem();&lt;br /&gt;
  }&lt;br /&gt;
  public void setResult(String searchResult) {&lt;br /&gt;
    lblCarNameValue.setText(searchResult);&lt;br /&gt;
  }&lt;br /&gt;
} // End of class AutoSearchUI&lt;br /&gt;
class ButtonHandler implements ActionListener {&lt;br /&gt;
  AutoSearchUI objAutoSearchUI;&lt;br /&gt;
  public void actionPerformed(ActionEvent e) {&lt;br /&gt;
    String searchResult = null;&lt;br /&gt;
    if (e.getActionCommand().equals(AutoSearchUI.EXIT)) {&lt;br /&gt;
      System.exit(1);&lt;br /&gt;
    }&lt;br /&gt;
    if (e.getActionCommand().equals(AutoSearchUI.SEARCH)) {&lt;br /&gt;
      //get input values&lt;br /&gt;
      String vhCategory = objAutoSearchUI.getSelectedCategory();&lt;br /&gt;
      String vhType = objAutoSearchUI.getSelectedType();&lt;br /&gt;
      //get one of Luxury or NonLuxury vehicle factories&lt;br /&gt;
      VehicleFactory vf = VehicleFactory.getVehicleFactory(vhCategory);&lt;br /&gt;
      if (vhType.equals(AutoSearchUI.CAR)) {&lt;br /&gt;
        Car c = vf.getCar();&lt;br /&gt;
        searchResult = &amp;quot;Name: &amp;quot; + c.getCarName() + &amp;quot;  Features: &amp;quot;&lt;br /&gt;
            + c.getCarFeatures();&lt;br /&gt;
      }&lt;br /&gt;
      if (vhType.equals(AutoSearchUI.SUV)) {&lt;br /&gt;
        SUV s = vf.getSUV();&lt;br /&gt;
        searchResult = &amp;quot;Name: &amp;quot; + s.getSUVName() + &amp;quot;  Features: &amp;quot;&lt;br /&gt;
            + s.getSUVFeatures();&lt;br /&gt;
      }&lt;br /&gt;
      objAutoSearchUI.setResult(searchResult);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public ButtonHandler() {&lt;br /&gt;
  }&lt;br /&gt;
  public ButtonHandler(AutoSearchUI inObjAutoSearchUI) {&lt;br /&gt;
    objAutoSearchUI = inObjAutoSearchUI;&lt;br /&gt;
  }&lt;br /&gt;
} // End of class ButtonHandler&lt;br /&gt;
abstract class VehicleFactory {&lt;br /&gt;
  public static final String LUXURY_VEHICLE = &amp;quot;Luxury&amp;quot;;&lt;br /&gt;
  public static final String NON_LUXURY_VEHICLE = &amp;quot;Non-Luxury&amp;quot;;&lt;br /&gt;
  public abstract Car getCar();&lt;br /&gt;
  public abstract SUV getSUV();&lt;br /&gt;
  public static VehicleFactory getVehicleFactory(String type) {&lt;br /&gt;
    if (type.equals(VehicleFactory.LUXURY_VEHICLE))&lt;br /&gt;
      return new LuxuryVehicleFactory();&lt;br /&gt;
    if (type.equals(VehicleFactory.NON_LUXURY_VEHICLE))&lt;br /&gt;
      return new NonLuxuryVehicleFactory();&lt;br /&gt;
    return new LuxuryVehicleFactory();&lt;br /&gt;
  }&lt;br /&gt;
} // End of class&lt;br /&gt;
interface Car {&lt;br /&gt;
  public String getCarName();&lt;br /&gt;
  public String getCarFeatures();&lt;br /&gt;
} // End of class&lt;br /&gt;
interface SUV {&lt;br /&gt;
  public String getSUVName();&lt;br /&gt;
  public String getSUVFeatures();&lt;br /&gt;
} // End of class&lt;br /&gt;
class LuxuryCar implements Car {&lt;br /&gt;
  private String name;&lt;br /&gt;
  public LuxuryCar(String cName) {&lt;br /&gt;
    name = cName;&lt;br /&gt;
  }&lt;br /&gt;
  public String getCarName() {&lt;br /&gt;
    return name;&lt;br /&gt;
  }&lt;br /&gt;
  public String getCarFeatures() {&lt;br /&gt;
    return &amp;quot;Luxury Car Features &amp;quot;;&lt;br /&gt;
  };&lt;br /&gt;
} // End of class&lt;br /&gt;
class LuxurySUV implements SUV {&lt;br /&gt;
  private String name;&lt;br /&gt;
  public LuxurySUV(String sName) {&lt;br /&gt;
    name = sName;&lt;br /&gt;
  }&lt;br /&gt;
  public String getSUVName() {&lt;br /&gt;
    return name;&lt;br /&gt;
  }&lt;br /&gt;
  public String getSUVFeatures() {&lt;br /&gt;
    return &amp;quot;Luxury SUV Features &amp;quot;;&lt;br /&gt;
  };&lt;br /&gt;
} // End of class&lt;br /&gt;
class LuxuryVehicleFactory extends VehicleFactory {&lt;br /&gt;
  public Car getCar() {&lt;br /&gt;
    return new LuxuryCar(&amp;quot;L-C&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  public SUV getSUV() {&lt;br /&gt;
    return new LuxurySUV(&amp;quot;L-S&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
} // End of class&lt;br /&gt;
class NonLuxuryCar implements Car {&lt;br /&gt;
  private String name;&lt;br /&gt;
  public NonLuxuryCar(String cName) {&lt;br /&gt;
    name = cName;&lt;br /&gt;
  }&lt;br /&gt;
  public String getCarName() {&lt;br /&gt;
    return name;&lt;br /&gt;
  }&lt;br /&gt;
  public String getCarFeatures() {&lt;br /&gt;
    return &amp;quot;Non-Luxury Car Features &amp;quot;;&lt;br /&gt;
  };&lt;br /&gt;
} // End of class&lt;br /&gt;
class NonLuxurySUV implements SUV {&lt;br /&gt;
  private String name;&lt;br /&gt;
  public NonLuxurySUV(String sName) {&lt;br /&gt;
    name = sName;&lt;br /&gt;
  }&lt;br /&gt;
  public String getSUVName() {&lt;br /&gt;
    return name;&lt;br /&gt;
  }&lt;br /&gt;
  public String getSUVFeatures() {&lt;br /&gt;
    return &amp;quot;Non-Luxury SUV Features &amp;quot;;&lt;br /&gt;
  };&lt;br /&gt;
} // End of class&lt;br /&gt;
class NonLuxuryVehicleFactory extends VehicleFactory {&lt;br /&gt;
  public Car getCar() {&lt;br /&gt;
    return new NonLuxuryCar(&amp;quot;NL-C&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  public SUV getSUV() {&lt;br /&gt;
    return new NonLuxurySUV(&amp;quot;NL-S&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
} // End of class&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Abstract Factory Pattern in Java 2 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
//[C] 2002 Sun Microsystems, Inc.---&lt;br /&gt;
public class RunAbstractFactoryPattern {&lt;br /&gt;
    public static void main(String [] arguments){&lt;br /&gt;
        System.out.println(&amp;quot;Example for the AbstractFactory pattern&amp;quot;);&lt;br /&gt;
        System.out.println();&lt;br /&gt;
        System.out.println(&amp;quot; (take a look in the RunPattern code. Notice that you can&amp;quot;);&lt;br /&gt;
        System.out.println(&amp;quot;  use the Address and PhoneNumber classes when writing&amp;quot;);&lt;br /&gt;
        System.out.println(&amp;quot;  almost all of the code. This allows you to write a very&amp;quot;);&lt;br /&gt;
        System.out.println(&amp;quot;  generic framework, and plug in Concrete Factories&amp;quot;);&lt;br /&gt;
        System.out.println(&amp;quot;  and Products to specialize the behavior of your code)&amp;quot;);&lt;br /&gt;
        System.out.println();&lt;br /&gt;
        &lt;br /&gt;
        System.out.println(&amp;quot;Creating U.S. Address and Phone Number:&amp;quot;);&lt;br /&gt;
        AddressFactory usAddressFactory = new USAddressFactory();&lt;br /&gt;
        Address usAddress = usAddressFactory.createAddress();&lt;br /&gt;
        PhoneNumber usPhone = usAddressFactory.createPhoneNumber();&lt;br /&gt;
        &lt;br /&gt;
        usAddress.setStreet(&amp;quot;142 Lois Lane&amp;quot;);&lt;br /&gt;
        usAddress.setCity(&amp;quot;Metropolis&amp;quot;);&lt;br /&gt;
        usAddress.setRegion(&amp;quot;WY&amp;quot;);&lt;br /&gt;
        usAddress.setPostalCode(&amp;quot;54321&amp;quot;);&lt;br /&gt;
        usPhone.setPhoneNumber(&amp;quot;7039214722&amp;quot;);&lt;br /&gt;
        &lt;br /&gt;
        System.out.println(&amp;quot;U.S. address:&amp;quot;);&lt;br /&gt;
        System.out.println(usAddress.getFullAddress());&lt;br /&gt;
        System.out.println(&amp;quot;U.S. phone number:&amp;quot;);&lt;br /&gt;
        System.out.println(usPhone.getPhoneNumber());&lt;br /&gt;
        System.out.println();&lt;br /&gt;
        System.out.println();&lt;br /&gt;
        &lt;br /&gt;
        System.out.println(&amp;quot;Creating French Address and Phone Number:&amp;quot;);&lt;br /&gt;
        AddressFactory frenchAddressFactory = new FrenchAddressFactory();&lt;br /&gt;
        Address frenchAddress = frenchAddressFactory.createAddress();&lt;br /&gt;
        PhoneNumber frenchPhone = frenchAddressFactory.createPhoneNumber();&lt;br /&gt;
        &lt;br /&gt;
        frenchAddress.setStreet(&amp;quot;21 Rue Victor Hugo&amp;quot;);&lt;br /&gt;
        frenchAddress.setCity(&amp;quot;Courbevoie&amp;quot;);&lt;br /&gt;
        frenchAddress.setPostalCode(&amp;quot;40792&amp;quot;);&lt;br /&gt;
        frenchPhone.setPhoneNumber(&amp;quot;011324290&amp;quot;);&lt;br /&gt;
        &lt;br /&gt;
        System.out.println(&amp;quot;French address:&amp;quot;);&lt;br /&gt;
        System.out.println(frenchAddress.getFullAddress());&lt;br /&gt;
        System.out.println(&amp;quot;French phone number:&amp;quot;);&lt;br /&gt;
        System.out.println(frenchPhone.getPhoneNumber());&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
class FrenchAddressFactory implements AddressFactory{&lt;br /&gt;
    public Address createAddress(){&lt;br /&gt;
        return new FrenchAddress();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public PhoneNumber createPhoneNumber(){&lt;br /&gt;
        return new FrenchPhoneNumber();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
class USAddressFactory implements AddressFactory{&lt;br /&gt;
    public Address createAddress(){&lt;br /&gt;
        return new USAddress();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public PhoneNumber createPhoneNumber(){&lt;br /&gt;
        return new USPhoneNumber();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
class USPhoneNumber extends PhoneNumber{&lt;br /&gt;
    private static final String COUNTRY_CODE = &amp;quot;01&amp;quot;;&lt;br /&gt;
    private static final int NUMBER_LENGTH = 10;&lt;br /&gt;
    &lt;br /&gt;
    public String getCountryCode(){ return COUNTRY_CODE; }&lt;br /&gt;
    &lt;br /&gt;
    public void setPhoneNumber(String newNumber){&lt;br /&gt;
        if (newNumber.length() == NUMBER_LENGTH){&lt;br /&gt;
            super.setPhoneNumber(newNumber);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
interface AddressFactory{&lt;br /&gt;
    public Address createAddress();&lt;br /&gt;
    public PhoneNumber createPhoneNumber();&lt;br /&gt;
}&lt;br /&gt;
abstract class Address{&lt;br /&gt;
    private String street;&lt;br /&gt;
    private String city;&lt;br /&gt;
    private String region;&lt;br /&gt;
    private String postalCode;&lt;br /&gt;
    &lt;br /&gt;
    public static final String EOL_STRING =&lt;br /&gt;
        System.getProperty(&amp;quot;line.separator&amp;quot;);&lt;br /&gt;
    public static final String SPACE = &amp;quot; &amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    public String getStreet(){ return street; }&lt;br /&gt;
    public String getCity(){ return city; }&lt;br /&gt;
    public String getPostalCode(){ return postalCode; }&lt;br /&gt;
    public String getRegion(){ return region; }&lt;br /&gt;
    public abstract String getCountry();&lt;br /&gt;
    &lt;br /&gt;
    public String getFullAddress(){&lt;br /&gt;
        return street + EOL_STRING +&lt;br /&gt;
            city + SPACE + postalCode + EOL_STRING;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public void setStreet(String newStreet){ street = newStreet; }&lt;br /&gt;
    public void setCity(String newCity){ city = newCity; }&lt;br /&gt;
    public void setRegion(String newRegion){ region = newRegion; }&lt;br /&gt;
    public void setPostalCode(String newPostalCode){ postalCode = newPostalCode; }&lt;br /&gt;
}&lt;br /&gt;
abstract class PhoneNumber{&lt;br /&gt;
    private String phoneNumber;&lt;br /&gt;
    public abstract String getCountryCode();&lt;br /&gt;
    &lt;br /&gt;
    public String getPhoneNumber(){ return phoneNumber; }&lt;br /&gt;
    &lt;br /&gt;
    public void setPhoneNumber(String newNumber){&lt;br /&gt;
        try{&lt;br /&gt;
            Long.parseLong(newNumber);&lt;br /&gt;
            phoneNumber = newNumber;&lt;br /&gt;
        }&lt;br /&gt;
        catch (NumberFormatException exc){&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class FrenchPhoneNumber extends PhoneNumber{&lt;br /&gt;
    private static final String COUNTRY_CODE = &amp;quot;33&amp;quot;;&lt;br /&gt;
    private static final int NUMBER_LENGTH = 9;&lt;br /&gt;
    &lt;br /&gt;
    public String getCountryCode(){ return COUNTRY_CODE; }&lt;br /&gt;
    &lt;br /&gt;
    public void setPhoneNumber(String newNumber){&lt;br /&gt;
        if (newNumber.length() == NUMBER_LENGTH){&lt;br /&gt;
            super.setPhoneNumber(newNumber);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
class FrenchAddress extends Address{&lt;br /&gt;
    private static final String COUNTRY = &amp;quot;FRANCE&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    public String getCountry(){ return COUNTRY; }&lt;br /&gt;
    &lt;br /&gt;
    public String getFullAddress(){&lt;br /&gt;
        return getStreet() + EOL_STRING +&lt;br /&gt;
            getPostalCode() + SPACE + getCity() +&lt;br /&gt;
            EOL_STRING + COUNTRY + EOL_STRING;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
class USAddress extends Address{&lt;br /&gt;
    private static final String COUNTRY = &amp;quot;UNITED STATES&amp;quot;;&lt;br /&gt;
    private static final String COMMA = &amp;quot;,&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    public String getCountry(){ return COUNTRY; }&lt;br /&gt;
    &lt;br /&gt;
    public String getFullAddress(){&lt;br /&gt;
        return getStreet() + EOL_STRING +&lt;br /&gt;
            getCity() + COMMA + SPACE + getRegion() +&lt;br /&gt;
            SPACE + getPostalCode() + EOL_STRING +&lt;br /&gt;
            COUNTRY + EOL_STRING;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Factory Method Pattern in Java ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
//[C] 2002 Sun Microsystems, Inc.---&lt;br /&gt;
import java.awt.Container;&lt;br /&gt;
import java.awt.GridLayout;&lt;br /&gt;
import java.awt.event.ActionEvent;&lt;br /&gt;
import java.awt.event.ActionListener;&lt;br /&gt;
import java.awt.event.WindowAdapter;&lt;br /&gt;
import java.awt.event.WindowEvent;&lt;br /&gt;
import java.io.Serializable;&lt;br /&gt;
import javax.swing.BoxLayout;&lt;br /&gt;
import javax.swing.JButton;&lt;br /&gt;
import javax.swing.JComponent;&lt;br /&gt;
import javax.swing.JFrame;&lt;br /&gt;
import javax.swing.JLabel;&lt;br /&gt;
import javax.swing.JPanel;&lt;br /&gt;
import javax.swing.JTextArea;&lt;br /&gt;
import javax.swing.JTextField;&lt;br /&gt;
&lt;br /&gt;
public class RunFactoryMethodPattern {&lt;br /&gt;
    public static void main(String [] arguments){&lt;br /&gt;
        System.out.println(&amp;quot;Example for the FactoryMethod pattern&amp;quot;);&lt;br /&gt;
        System.out.println();&lt;br /&gt;
        &lt;br /&gt;
        System.out.println(&amp;quot;Creating a Contact object&amp;quot;);&lt;br /&gt;
        System.out.println();&lt;br /&gt;
        Contact someone = new Contact();&lt;br /&gt;
        &lt;br /&gt;
        System.out.println(&amp;quot;Creating a GUI editor for the Contact&amp;quot;);&lt;br /&gt;
        System.out.println();&lt;br /&gt;
        System.out.println(&amp;quot;The GUI defined in the EditorGui class is a truly generic editor.&amp;quot;);&lt;br /&gt;
        System.out.println(&amp;quot;It accepts an argument of type ItemEditor, and delegates&amp;quot;);&lt;br /&gt;
        System.out.println(&amp;quot; all editing tasks to its ItemEditor and the associated GUI.&amp;quot;);&lt;br /&gt;
        System.out.println(&amp;quot; The getEditor() Factory Method is used to obtain the ItemEditor&amp;quot;);&lt;br /&gt;
        System.out.println(&amp;quot; for the example.&amp;quot;);&lt;br /&gt;
        System.out.println();&lt;br /&gt;
        System.out.println(&amp;quot;Notice that the editor in the top portion of the GUI is,&amp;quot;);&lt;br /&gt;
        System.out.println(&amp;quot; in fact, returned by the ItemEditor belonging to the&amp;quot;);&lt;br /&gt;
        System.out.println(&amp;quot; Contact class, and has appropriate fields for that class.&amp;quot;);&lt;br /&gt;
        &lt;br /&gt;
        EditorGui runner = new EditorGui(someone.getEditor());&lt;br /&gt;
        runner.createGui();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
class EditorGui implements ActionListener{&lt;br /&gt;
    private JFrame mainFrame;&lt;br /&gt;
    private JTextArea display;&lt;br /&gt;
    private JButton update, exit;&lt;br /&gt;
    private JPanel controlPanel, displayPanel, editorPanel;&lt;br /&gt;
    private ItemEditor editor;&lt;br /&gt;
    &lt;br /&gt;
    public EditorGui(ItemEditor edit){&lt;br /&gt;
        editor = edit;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public void createGui(){&lt;br /&gt;
        mainFrame = new JFrame(&amp;quot;Factory Pattern Example&amp;quot;);&lt;br /&gt;
        Container content = mainFrame.getContentPane();&lt;br /&gt;
        content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));&lt;br /&gt;
        &lt;br /&gt;
        editorPanel = new JPanel();&lt;br /&gt;
        editorPanel.add(editor.getGUI());&lt;br /&gt;
        content.add(editorPanel);&lt;br /&gt;
        &lt;br /&gt;
        displayPanel = new JPanel();&lt;br /&gt;
        display = new JTextArea(10, 40);&lt;br /&gt;
        display.setEditable(false);&lt;br /&gt;
        displayPanel.add(display);&lt;br /&gt;
        content.add(displayPanel);&lt;br /&gt;
        &lt;br /&gt;
        controlPanel = new JPanel();&lt;br /&gt;
        update = new JButton(&amp;quot;Update Item&amp;quot;);&lt;br /&gt;
        exit = new JButton(&amp;quot;Exit&amp;quot;);&lt;br /&gt;
        controlPanel.add(update);&lt;br /&gt;
        controlPanel.add(exit);&lt;br /&gt;
        content.add(controlPanel);&lt;br /&gt;
        &lt;br /&gt;
        update.addActionListener(this);&lt;br /&gt;
        exit.addActionListener(this);&lt;br /&gt;
        &lt;br /&gt;
        mainFrame.addWindowListener(new WindowCloseManager());&lt;br /&gt;
        mainFrame.pack();&lt;br /&gt;
        mainFrame.setVisible(true);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    public void actionPerformed(ActionEvent evt){&lt;br /&gt;
        Object originator = evt.getSource();&lt;br /&gt;
        if (originator == update){&lt;br /&gt;
            updateItem();&lt;br /&gt;
        }&lt;br /&gt;
        else if (originator == exit){&lt;br /&gt;
            exitApplication();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    private class WindowCloseManager extends WindowAdapter{&lt;br /&gt;
        public void windowClosing(WindowEvent evt){&lt;br /&gt;
            exitApplication();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    private void updateItem(){&lt;br /&gt;
        editor.rumitChanges();&lt;br /&gt;
        display.setText(editor.toString());&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    private void exitApplication(){&lt;br /&gt;
        System.exit(0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
class Contact implements Editable, Serializable {&lt;br /&gt;
    private String name;&lt;br /&gt;
    private String relationship;&lt;br /&gt;
    public ItemEditor getEditor() {&lt;br /&gt;
        return new ContactEditor();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    private class ContactEditor implements ItemEditor, Serializable {&lt;br /&gt;
        private transient JPanel panel;&lt;br /&gt;
        private transient JTextField nameField;&lt;br /&gt;
        private transient JTextField relationField;&lt;br /&gt;
        &lt;br /&gt;
        public JComponent getGUI() {&lt;br /&gt;
            if (panel == null) {&lt;br /&gt;
                panel = new JPanel();&lt;br /&gt;
                nameField = new JTextField(name);&lt;br /&gt;
                relationField = new JTextField(relationship);&lt;br /&gt;
                panel.setLayout(new GridLayout(2,2));&lt;br /&gt;
                panel.add(new JLabel(&amp;quot;Name:&amp;quot;));&lt;br /&gt;
                panel.add(nameField);&lt;br /&gt;
                panel.add(new JLabel(&amp;quot;Relationship:&amp;quot;));&lt;br /&gt;
                panel.add(relationField);&lt;br /&gt;
            } else {&lt;br /&gt;
                nameField.setText(name);&lt;br /&gt;
                relationField.setText(relationship);&lt;br /&gt;
            }&lt;br /&gt;
            return panel;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public void commitChanges() {&lt;br /&gt;
            if (panel != null) {&lt;br /&gt;
                name = nameField.getText();&lt;br /&gt;
                relationship = relationField.getText();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        public String toString(){&lt;br /&gt;
            return &amp;quot;\nContact:\n&amp;quot; +&lt;br /&gt;
                &amp;quot;    Name: &amp;quot; + name + &amp;quot;\n&amp;quot; +&lt;br /&gt;
                &amp;quot;    Relationship: &amp;quot; + relationship;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
interface Editable {&lt;br /&gt;
    public ItemEditor getEditor();&lt;br /&gt;
}&lt;br /&gt;
interface ItemEditor {&lt;br /&gt;
    public JComponent getGUI();&lt;br /&gt;
    public void commitChanges();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fly weight Factory ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Software Architecture Design Patterns in Java&lt;br /&gt;
by Partha Kuchana &lt;br /&gt;
Auerbach Publications&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
import java.util.HashMap;&lt;br /&gt;
import java.util.StringTokenizer;&lt;br /&gt;
import java.util.Vector;&lt;br /&gt;
public class FlyweightTest {&lt;br /&gt;
  public static void main(String[] args) throws Exception {&lt;br /&gt;
    Vector empList = initialize();&lt;br /&gt;
    FlyweightFactory factory = FlyweightFactory.getInstance();&lt;br /&gt;
    for (int i = 0; i &amp;lt; empList.size(); i++) {&lt;br /&gt;
      String s = (String) empList.elementAt(i);&lt;br /&gt;
      StringTokenizer st = new StringTokenizer(s, &amp;quot;,&amp;quot;);&lt;br /&gt;
      String name = st.nextToken();&lt;br /&gt;
      String title = st.nextToken();&lt;br /&gt;
      String division = st.nextToken();&lt;br /&gt;
      FlyweightIntr flyweight = factory.getFlyweight(division);&lt;br /&gt;
      //associate the flyweight&lt;br /&gt;
      //with the extrinsic data object.&lt;br /&gt;
      VCard card = new VCard(name, title, flyweight);&lt;br /&gt;
      card.print();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  private static Vector initialize() {&lt;br /&gt;
    //for simplicity values are being hardcoded.&lt;br /&gt;
    Vector v = new Vector();&lt;br /&gt;
    v.add(&amp;quot;name1,title1,North&amp;quot;);&lt;br /&gt;
    v.add(&amp;quot;name2,title2,South&amp;quot;);&lt;br /&gt;
    v.add(&amp;quot;name3,title1,North&amp;quot;);&lt;br /&gt;
    v.add(&amp;quot;name4,title3,East&amp;quot;);&lt;br /&gt;
    v.add(&amp;quot;name5,title4,East&amp;quot;);&lt;br /&gt;
    v.add(&amp;quot;name6,title2,East&amp;quot;);&lt;br /&gt;
    v.add(&amp;quot;name7,title1,West&amp;quot;);&lt;br /&gt;
    v.add(&amp;quot;name8,title3,West&amp;quot;);&lt;br /&gt;
    v.add(&amp;quot;name9,title1,West&amp;quot;);&lt;br /&gt;
    v.add(&amp;quot;name10,title6,South&amp;quot;);&lt;br /&gt;
    v.add(&amp;quot;name11,title5,North&amp;quot;);&lt;br /&gt;
    v.add(&amp;quot;name12,title1,North&amp;quot;);&lt;br /&gt;
    return v;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class FlyweightFactory {&lt;br /&gt;
  private HashMap lstFlyweight;&lt;br /&gt;
  private static FlyweightFactory factory = new FlyweightFactory();&lt;br /&gt;
  private FlyweightFactory() {&lt;br /&gt;
    lstFlyweight = new HashMap();&lt;br /&gt;
  }&lt;br /&gt;
  public synchronized FlyweightIntr getFlyweight(String divisionName) {&lt;br /&gt;
    if (lstFlyweight.get(divisionName) == null) {&lt;br /&gt;
      FlyweightIntr fw = new Flyweight(divisionName);&lt;br /&gt;
      lstFlyweight.put(divisionName, fw);&lt;br /&gt;
      return fw;&lt;br /&gt;
    } else {&lt;br /&gt;
      return (FlyweightIntr) lstFlyweight.get(divisionName);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public static FlyweightFactory getInstance() {&lt;br /&gt;
    return factory;&lt;br /&gt;
  }&lt;br /&gt;
  //Inner flyweight class&lt;br /&gt;
  private class Flyweight implements FlyweightIntr {&lt;br /&gt;
    private String company;&lt;br /&gt;
    private String address;&lt;br /&gt;
    private String city;&lt;br /&gt;
    private String state;&lt;br /&gt;
    private String zip;&lt;br /&gt;
    private void setValues(String cmp, String addr, String cty, String st,&lt;br /&gt;
        String zp) {&lt;br /&gt;
      company = cmp;&lt;br /&gt;
      address = addr;&lt;br /&gt;
      city = cty;&lt;br /&gt;
      state = st;&lt;br /&gt;
      zip = zp;&lt;br /&gt;
    }&lt;br /&gt;
    private Flyweight(String division) {&lt;br /&gt;
      // values are hard coded&lt;br /&gt;
      //for simplicity&lt;br /&gt;
      if (division.equals(&amp;quot;North&amp;quot;)) {&lt;br /&gt;
        setValues(&amp;quot;CMP&amp;quot;, &amp;quot;addr1&amp;quot;, &amp;quot;cty1&amp;quot;, &amp;quot;st1&amp;quot;, &amp;quot;10000&amp;quot;);&lt;br /&gt;
      }&lt;br /&gt;
      if (division.equals(&amp;quot;South&amp;quot;)) {&lt;br /&gt;
        setValues(&amp;quot;CMP&amp;quot;, &amp;quot;addr2&amp;quot;, &amp;quot;cty2&amp;quot;, &amp;quot;st2&amp;quot;, &amp;quot;20000&amp;quot;);&lt;br /&gt;
      }&lt;br /&gt;
      if (division.equals(&amp;quot;East&amp;quot;)) {&lt;br /&gt;
        setValues(&amp;quot;CMP&amp;quot;, &amp;quot;addr3&amp;quot;, &amp;quot;cty3&amp;quot;, &amp;quot;st3&amp;quot;, &amp;quot;30000&amp;quot;);&lt;br /&gt;
      }&lt;br /&gt;
      if (division.equals(&amp;quot;West&amp;quot;)) {&lt;br /&gt;
        setValues(&amp;quot;CMP&amp;quot;, &amp;quot;addr4&amp;quot;, &amp;quot;cty4&amp;quot;, &amp;quot;st4&amp;quot;, &amp;quot;40000&amp;quot;);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    public String getCompany() {&lt;br /&gt;
      return company;&lt;br /&gt;
    }&lt;br /&gt;
    public String getAddress() {&lt;br /&gt;
      return address;&lt;br /&gt;
    }&lt;br /&gt;
    public String getCity() {&lt;br /&gt;
      return city;&lt;br /&gt;
    }&lt;br /&gt;
    public String getState() {&lt;br /&gt;
      return state;&lt;br /&gt;
    }&lt;br /&gt;
    public String getZip() {&lt;br /&gt;
      return zip;&lt;br /&gt;
    }&lt;br /&gt;
  }// end of Flyweight&lt;br /&gt;
}// end of FlyweightFactory&lt;br /&gt;
interface FlyweightIntr {&lt;br /&gt;
  public String getCompany();&lt;br /&gt;
  public String getAddress();&lt;br /&gt;
  public String getCity();&lt;br /&gt;
  public String getState();&lt;br /&gt;
  public String getZip();&lt;br /&gt;
}&lt;br /&gt;
class VCard {&lt;br /&gt;
  String name;&lt;br /&gt;
  String title;&lt;br /&gt;
  FlyweightIntr objFW;&lt;br /&gt;
  public VCard(String n, String t, FlyweightIntr fw) {&lt;br /&gt;
    name = n;&lt;br /&gt;
    title = t;&lt;br /&gt;
    objFW = fw;&lt;br /&gt;
  }&lt;br /&gt;
  public void print() {&lt;br /&gt;
    System.out.println(name);&lt;br /&gt;
    System.out.println(title);&lt;br /&gt;
    System.out.println(objFW.getAddress() + &amp;quot;-&amp;quot; + objFW.getCity() + &amp;quot;-&amp;quot;&lt;br /&gt;
        + objFW.getState() + &amp;quot;-&amp;quot; + objFW.getZip());&lt;br /&gt;
    System.out.println(&amp;quot;----------------&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Illustrates use of Abstract Factory pattern ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
The Design Patterns Java Companion&lt;br /&gt;
Copyright (C) 1998, by James W. Cooper&lt;br /&gt;
IBM Thomas J. Watson Research Center&lt;br /&gt;
*/&lt;br /&gt;
import java.awt.Button;&lt;br /&gt;
import java.awt.Checkbox;&lt;br /&gt;
import java.awt.CheckboxGroup;&lt;br /&gt;
import java.awt.Color;&lt;br /&gt;
import java.awt.Dimension;&lt;br /&gt;
import java.awt.Frame;&lt;br /&gt;
import java.awt.Graphics;&lt;br /&gt;
import java.awt.GridLayout;&lt;br /&gt;
import java.awt.Label;&lt;br /&gt;
import java.awt.Panel;&lt;br /&gt;
import java.awt.event.ActionEvent;&lt;br /&gt;
import java.awt.event.ActionListener;&lt;br /&gt;
import java.awt.event.ItemEvent;&lt;br /&gt;
import java.awt.event.ItemListener;&lt;br /&gt;
public class Gardener extends Frame implements ActionListener, ItemListener {&lt;br /&gt;
  private Checkbox Vegie, Annual, Peren;&lt;br /&gt;
  private Button Center, Border, Shade, Quit;&lt;br /&gt;
  private Garden garden = null;&lt;br /&gt;
  private GardenPanel gardenPlot;&lt;br /&gt;
  private String borderPlant = &amp;quot;&amp;quot;, centerPlant = &amp;quot;&amp;quot;, shadePlant = &amp;quot;&amp;quot;;&lt;br /&gt;
  public Gardener() {&lt;br /&gt;
    super(&amp;quot;Garden planner&amp;quot;);&lt;br /&gt;
    setGUI();&lt;br /&gt;
  }&lt;br /&gt;
  //----------------------------------&lt;br /&gt;
  private void setGUI() {&lt;br /&gt;
    setBackground(Color.lightGray);&lt;br /&gt;
    setLayout(new GridLayout(1, 2));&lt;br /&gt;
    Panel left = new Panel();&lt;br /&gt;
    add(left);&lt;br /&gt;
    Panel right = new Panel();&lt;br /&gt;
    add(right);&lt;br /&gt;
    //create label and 3 radio buttons on left side&lt;br /&gt;
    left.setLayout(new GridLayout(4, 1));&lt;br /&gt;
    left.add(new Label(&amp;quot;Garden type&amp;quot;));&lt;br /&gt;
    CheckboxGroup grp = new CheckboxGroup();&lt;br /&gt;
    Vegie = new Checkbox(&amp;quot;Vegetable&amp;quot;, grp, false);&lt;br /&gt;
    Annual = new Checkbox(&amp;quot;Annual&amp;quot;, grp, false);&lt;br /&gt;
    Peren = new Checkbox(&amp;quot;Perennial&amp;quot;, grp, false);&lt;br /&gt;
    left.add(Vegie);&lt;br /&gt;
    left.add(Annual);&lt;br /&gt;
    left.add(Peren);&lt;br /&gt;
    Vegie.addItemListener(this);&lt;br /&gt;
    Peren.addItemListener(this);&lt;br /&gt;
    Annual.addItemListener(this);&lt;br /&gt;
    //now create right side&lt;br /&gt;
    right.setLayout(new GridLayout(2, 1));&lt;br /&gt;
    gardenPlot = new GardenPanel();&lt;br /&gt;
    gardenPlot.setBackground(Color.white);&lt;br /&gt;
    Panel botRight = new Panel();&lt;br /&gt;
    right.add(gardenPlot);&lt;br /&gt;
    right.add(botRight);&lt;br /&gt;
    Center = new Button(&amp;quot;Central&amp;quot;);&lt;br /&gt;
    Border = new Button(&amp;quot;Border&amp;quot;);&lt;br /&gt;
    Shade = new Button(&amp;quot;Shade&amp;quot;);&lt;br /&gt;
    Quit = new Button(&amp;quot;Quit&amp;quot;);&lt;br /&gt;
    botRight.add(Center);&lt;br /&gt;
    Center.addActionListener(this);&lt;br /&gt;
    botRight.add(Border);&lt;br /&gt;
    Border.addActionListener(this);&lt;br /&gt;
    botRight.add(Shade);&lt;br /&gt;
    Shade.addActionListener(this);&lt;br /&gt;
    botRight.add(Quit);&lt;br /&gt;
    Quit.addActionListener(this);&lt;br /&gt;
    setBounds(200, 200, 400, 300);&lt;br /&gt;
    setVisible(true);&lt;br /&gt;
  }&lt;br /&gt;
  //----------------------------------&lt;br /&gt;
  public void actionPerformed(ActionEvent e) {&lt;br /&gt;
    Object obj = e.getSource();&lt;br /&gt;
    if (obj == Center)&lt;br /&gt;
      setCenter();&lt;br /&gt;
    if (obj == Border)&lt;br /&gt;
      setBorder();&lt;br /&gt;
    if (obj == Shade)&lt;br /&gt;
      setShade();&lt;br /&gt;
    if (obj == Quit)&lt;br /&gt;
      System.exit(0);&lt;br /&gt;
  }&lt;br /&gt;
  //----------------------------------&lt;br /&gt;
  private void setCenter() {&lt;br /&gt;
    if (garden != null)&lt;br /&gt;
      centerPlant = garden.getCenter().getName();&lt;br /&gt;
    gardenPlot.repaint();&lt;br /&gt;
  }&lt;br /&gt;
  private void setBorder() {&lt;br /&gt;
    if (garden != null)&lt;br /&gt;
      borderPlant = garden.getBorder().getName();&lt;br /&gt;
    gardenPlot.repaint();&lt;br /&gt;
  }&lt;br /&gt;
  private void setShade() {&lt;br /&gt;
    if (garden != null)&lt;br /&gt;
      shadePlant = garden.getShade().getName();&lt;br /&gt;
    gardenPlot.repaint();&lt;br /&gt;
  }&lt;br /&gt;
  //----------------------------------&lt;br /&gt;
  public void itemStateChanged(ItemEvent e) {&lt;br /&gt;
    Checkbox ck = (Checkbox) e.getSource();&lt;br /&gt;
    garden = new GardenMaker().getGarden(ck.getLabel());&lt;br /&gt;
    shadePlant = &amp;quot;&amp;quot;;&lt;br /&gt;
    centerPlant = &amp;quot;&amp;quot;;&lt;br /&gt;
    borderPlant = &amp;quot;&amp;quot;;&lt;br /&gt;
    gardenPlot.repaint();&lt;br /&gt;
  }&lt;br /&gt;
  //----------------------------------&lt;br /&gt;
  static public void main(String argv[]) {&lt;br /&gt;
    new Gardener();&lt;br /&gt;
  }&lt;br /&gt;
  //--------------------------------&lt;br /&gt;
  class GardenPanel extends Panel {&lt;br /&gt;
    public void paint(Graphics g) {&lt;br /&gt;
      Dimension sz = getSize();&lt;br /&gt;
      g.setColor(Color.lightGray);&lt;br /&gt;
      g.fillArc(0, 0, 80, 80, 0, 360);&lt;br /&gt;
      g.setColor(Color.black);&lt;br /&gt;
      g.drawRect(0, 0, sz.width - 1, sz.height - 1);&lt;br /&gt;
      g.drawString(centerPlant, 100, 50);&lt;br /&gt;
      g.drawString(borderPlant, 75, 120);&lt;br /&gt;
      g.drawString(shadePlant, 10, 40);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
} //end of Gardener class&lt;br /&gt;
//=============================================&lt;br /&gt;
class GardenMaker {&lt;br /&gt;
  //Abstract Factory which returns one of three gardens&lt;br /&gt;
  private Garden gd;&lt;br /&gt;
  public Garden getGarden(String gtype) {&lt;br /&gt;
    gd = new VegieGarden(); //default&lt;br /&gt;
    if (gtype.equals(&amp;quot;Perennial&amp;quot;))&lt;br /&gt;
      gd = new PerennialGarden();&lt;br /&gt;
    if (gtype.equals(&amp;quot;Annual&amp;quot;))&lt;br /&gt;
      gd = new AnnualGarden();&lt;br /&gt;
    return gd;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
abstract class Garden {&lt;br /&gt;
  public abstract Plant getShade();&lt;br /&gt;
  public abstract Plant getCenter();&lt;br /&gt;
  public abstract Plant getBorder();&lt;br /&gt;
}&lt;br /&gt;
class Plant {&lt;br /&gt;
  String name;&lt;br /&gt;
  public Plant(String pname) {&lt;br /&gt;
    name = pname; //save name&lt;br /&gt;
  }&lt;br /&gt;
  public String getName() {&lt;br /&gt;
    return name;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class VegieGarden extends Garden {&lt;br /&gt;
  public Plant getShade() {&lt;br /&gt;
    return new Plant(&amp;quot;Broccoli&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  public Plant getCenter() {&lt;br /&gt;
    return new Plant(&amp;quot;Corn&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  public Plant getBorder() {&lt;br /&gt;
    return new Plant(&amp;quot;Peas&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class AnnualGarden extends Garden {&lt;br /&gt;
  public Plant getShade() {&lt;br /&gt;
    return new Plant(&amp;quot;Coleus&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  public Plant getCenter() {&lt;br /&gt;
    return new Plant(&amp;quot;Marigold&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  public Plant getBorder() {&lt;br /&gt;
    return new Plant(&amp;quot;Alyssum&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class PerennialGarden extends Garden&lt;br /&gt;
{&lt;br /&gt;
   public Plant getShade()&lt;br /&gt;
   {&lt;br /&gt;
      return new Plant(&amp;quot;Astilbe&amp;quot;);&lt;br /&gt;
   }&lt;br /&gt;
 public Plant getCenter()&lt;br /&gt;
 {&lt;br /&gt;
    return new Plant(&amp;quot;Dicentrum&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 public Plant getBorder()&lt;br /&gt;
 {&lt;br /&gt;
    return new Plant(&amp;quot;Sedum&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;/div&gt;</summary>
			</entry>

	</feed>