用java接口实现工厂模式如下:
interface Service{
void method1();
void method2();
}
interface ServiceFactory{
Service getService();
}
class Implementation1 implements Service{
Implementation1(){};
public void method1(){System.out.println("Implemention1 method1");}
public void method2(){System.out.println("Implemention1 method2");}
}
class Implementation2 implements Service{
Implementation2(){}
public void method1(){System.out.println("Implementation2 method1");}
public void method2(){System.out.println("Implementation2 method2");}
}
class Implementation1ServiceFactory implements ServiceFactory{
public Service getService(){
return new Implementation1();
}
}
class Implementation2ServiceFactory implements ServiceFactory{
public Service getService(){
return new Implementation2();
}
}
public class TopCoder{
public static void main(String[] args){
serviceConsumer(new Implementation1ServiceFactory());
serviceConsumer(new Implementation2ServiceFactory());
}
public static void serviceConsumer(ServiceFactory sf){
Service s=sf.getService();
s.method1();
s.method2();
}
}
该实现有一个小小的缺憾,那就是Implementation1 和 Implementation2的构造函数都是public。下面用Java的内部类实现工厂模式,可以弥补这个缺憾
interface Service{
void method1();
void method2();
}
interface ServiceFactory{
Service getService();
}
class Implementation1 implements Service{
Implementation1(){};
public void method1(){System.out.println("Implemention1 method1");}
public void method2(){System.out.println("Implemention1 method2");}
public static ServiceFactory factory=new ServiceFactory(){
public Service getService(){
return new Implementation1();
}
};
}
class Implementation2 implements Service{
Implementation2(){}
public void method1(){System.out.println("Implementation2 method1");}
public void method2(){System.out.println("Implementation2 method2");}
public static ServiceFactory factory=new ServiceFactory(){
public Service getService(){
return new Implementation2();
}
};
}
public class TopCoder{
public static void main(String[] args){
serviceConsumer(Implementation1.factory);
serviceConsumer(Implementation2.factory);
}
public static void serviceConsumer(ServiceFactory sf){
Service s=sf.getService();
s.method1();
s.method2();
}
}