Design Patterns - Abstract Factory

Abstract Factory

Problem - A information manager which manages phone number. Phone numbers have a particular rule on which they get generated depending on areas and countries. If at some point the application should be changed in order to support adding numbers form a new country, the code of the application would have to be changed and it would become more and more complicated.

Solution -
 abstract class AbstractAddress {
	public abstract void getAddress();
}

class USAddress extends AbstractAddress {
	public void getAddress() { };
}

class UKAddress extends AbstractAddress{
	public void getAddress() { };
}

abstract class AbstractPhoneNumber {
	public abstract void getPhoneNumber();
}

class USPhoneNumber extends AbstractPhoneNumber {
	public void getPhoneNumber() { };
}

class UKPhoneNumber extends AbstractPhoneNumber {
	public void getPhoneNumber() { };	
}

abstract class AbstractFactory {
	abstract AbstractAddress createAddress();
	abstract AbstractPhoneNumber createPhoneNumber();
}

class USContactFactory extends AbstractFactory {
	AbstractAddress createAddress(){
		return new USAddress();
	}
	AbstractPhoneNumber createPhoneNumber(){ 
		return new USPhoneNumber();
	}
}

class UKContactFactory extends AbstractFactory {
	AbstractAddress createAddress(){
		return new UKAddress();
	}
	AbstractPhoneNumber createPhoneNumber(){
		return new UKPhoneNumber();
	}
}

//Factory creator - an indirect way of instantiating the factories
class FactoryMaker{
	private static AbstractFactory pf=null;
	static AbstractFactory getFactory(String choice){
		if(choice.equals("US")){
			pf=new USContactFactory();
		} else if(choice.equals("UK")){
			pf=new UKContactFactory();
		} 
		return pf;
	}
}

// Client
public class Client{
	public static void main(String args[]){
		AbstractFactory pf=FactoryMaker.getFactory("US");
		AbstractAddress address=pf.createAddress();
		....
	}
}