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