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();
....
}
}