| //[C] 2002 Sun Microsystems, Inc.---
 
 public class RunAbstractFactoryPattern {
 public static void main(String [] arguments){
 System.out.println("Example for the AbstractFactory pattern");
 System.out.println();
 System.out.println(" (take a look in the RunPattern code. Notice that you can");
 System.out.println("  use the Address and PhoneNumber classes when writing");
 System.out.println("  almost all of the code. This allows you to write a very");
 System.out.println("  generic framework, and plug in Concrete Factories");
 System.out.println("  and Products to specialize the behavior of your code)");
 System.out.println();
 
 System.out.println("Creating U.S. Address and Phone Number:");
 AddressFactory usAddressFactory = new USAddressFactory();
 Address usAddress = usAddressFactory.createAddress();
 PhoneNumber usPhone = usAddressFactory.createPhoneNumber();
 
 usAddress.setStreet("142 Lois Lane");
 usAddress.setCity("Metropolis");
 usAddress.setRegion("WY");
 usAddress.setPostalCode("54321");
 usPhone.setPhoneNumber("7039214722");
 
 System.out.println("U.S. address:");
 System.out.println(usAddress.getFullAddress());
 System.out.println("U.S. phone number:");
 System.out.println(usPhone.getPhoneNumber());
 System.out.println();
 System.out.println();
 
 System.out.println("Creating French Address and Phone Number:");
 AddressFactory frenchAddressFactory = new FrenchAddressFactory();
 Address frenchAddress = frenchAddressFactory.createAddress();
 PhoneNumber frenchPhone = frenchAddressFactory.createPhoneNumber();
 
 frenchAddress.setStreet("21 Rue Victor Hugo");
 frenchAddress.setCity("Courbevoie");
 frenchAddress.setPostalCode("40792");
 frenchPhone.setPhoneNumber("011324290");
 
 System.out.println("French address:");
 System.out.println(frenchAddress.getFullAddress());
 System.out.println("French phone number:");
 System.out.println(frenchPhone.getPhoneNumber());
 }
 }
 
 class FrenchAddressFactory implements AddressFactory{
 public Address createAddress(){
 return new FrenchAddress();
 }
 
 public PhoneNumber createPhoneNumber(){
 return new FrenchPhoneNumber();
 }
 }
 class USAddressFactory implements AddressFactory{
 public Address createAddress(){
 return new USAddress();
 }
 
 public PhoneNumber createPhoneNumber(){
 return new USPhoneNumber();
 }
 }
 
 class USPhoneNumber extends PhoneNumber{
 private static final String COUNTRY_CODE = "01";
 private static final int NUMBER_LENGTH = 10;
 
 public String getCountryCode(){ return COUNTRY_CODE; }
 
 public void setPhoneNumber(String newNumber){
 if (newNumber.length() == NUMBER_LENGTH){
 super.setPhoneNumber(newNumber);
 }
 }
 }
 interface AddressFactory{
 public Address createAddress();
 public PhoneNumber createPhoneNumber();
 }
 abstract class Address{
 private String street;
 private String city;
 private String region;
 private String postalCode;
 
 public static final String EOL_STRING =
 System.getProperty("line.separator");
 public static final String SPACE = " ";
 
 public String getStreet(){ return street; }
 public String getCity(){ return city; }
 public String getPostalCode(){ return postalCode; }
 public String getRegion(){ return region; }
 public abstract String getCountry();
 
 public String getFullAddress(){
 return street + EOL_STRING +
 city + SPACE + postalCode + EOL_STRING;
 }
 
 public void setStreet(String newStreet){ street = newStreet; }
 public void setCity(String newCity){ city = newCity; }
 public void setRegion(String newRegion){ region = newRegion; }
 public void setPostalCode(String newPostalCode){ postalCode = newPostalCode; }
 }
 
 abstract class PhoneNumber{
 private String phoneNumber;
 public abstract String getCountryCode();
 
 public String getPhoneNumber(){ return phoneNumber; }
 
 public void setPhoneNumber(String newNumber){
 try{
 Long.parseLong(newNumber);
 phoneNumber = newNumber;
 }
 catch (NumberFormatException exc){
 }
 }
 }
 
 
 class FrenchPhoneNumber extends PhoneNumber{
 private static final String COUNTRY_CODE = "33";
 private static final int NUMBER_LENGTH = 9;
 
 public String getCountryCode(){ return COUNTRY_CODE; }
 
 public void setPhoneNumber(String newNumber){
 if (newNumber.length() == NUMBER_LENGTH){
 super.setPhoneNumber(newNumber);
 }
 }
 }
 
 class FrenchAddress extends Address{
 private static final String COUNTRY = "FRANCE";
 
 public String getCountry(){ return COUNTRY; }
 
 public String getFullAddress(){
 return getStreet() + EOL_STRING +
 getPostalCode() + SPACE + getCity() +
 EOL_STRING + COUNTRY + EOL_STRING;
 }
 }
 
 class USAddress extends Address{
 private static final String COUNTRY = "UNITED STATES";
 private static final String COMMA = ",";
 
 public String getCountry(){ return COUNTRY; }
 
 public String getFullAddress(){
 return getStreet() + EOL_STRING +
 getCity() + COMMA + SPACE + getRegion() +
 SPACE + getPostalCode() + EOL_STRING +
 COUNTRY + EOL_STRING;
 }
 }
 
 
 
 
 |