Mega Code Archive

 
Categories / Java / Design Pattern
 

Abstract Factory Pattern in Java 2

//[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;     } }