>>>接口与工厂模式<<<
接口典型的应用就是多继承,而工厂方法设计模式能生成实现同一接口的对象,这与我们直接在使用的地方new某个实现对象是不同的,我们通过工厂对象上调用是业务实现对象创建方法,而该工厂对象将生成接口的某个业务实现的对象,理念上,我们的代码将完全与接口分离,这使得我们可以透明地将某个实现替换为另一个实现。下面的实例展示了工厂方法的结构:
- // 业务接口
- interface Service {
- void method1();
- void method2();
- }
- // 业务工厂
- interface ServiceFactory {
- Service getService();
- }
- // 业务1的实现
- class Implementation1 implements Service {
- Implementation1() {} // 包访问
- public void method1() {System.out.println("Implementation1 method1");}
- public void method2() {System.out.println("Implementation1 method2");}
- }
- // 业务1的工厂
- class Implementation1Factory implements ServiceFactory {
- public Service getService() {
- return new Implementation1();
- }
- }
- //业务2的实现
- class Implementation2 implements Service {
- Implementation2() {} // 包访问
- public void method1() {System.out.println("Implementation2 method1");}
- public void method2() {System.out.println("Implementation2 method2");}
- }
- //业务2的工厂
- class Implementation2Factory implements ServiceFactory {
- public Service getService() {
- return new Implementation2();
- }
- }
- //工厂应用
- public class Factories {
- public static void serviceConsumer(ServiceFactory fact) {
- // 通过不同的工厂获得不同的业务实现
- Service s = fact.getService();
- s.method1();
- s.method2();
- }
- public static void main(String[] args) {
- serviceConsumer(new Implementation1Factory());
- // 业务实现可以透明的改变:
- serviceConsumer(new Implementation2Factory());
- }
- } /* Output:
- Implementation1 method1
- Implementation1 method2
- Implementation2 method1
- Implementation2 method2
- */
如果不使用工厂方法,你的代码就必须在使用处指定将要创建的Service的确切类型,以便调用合适的构造器。为什么需要这种额外的间接性呢?一个常见的原因就是想要创建框架,业务实例的生产过程对客户是透明的,而且还可以在工厂方法返回实例前对业务对象进行额外处理。
>>>内部类与工厂模式<<<
看看再使用匿名内部类来修改上面的程序:
- interface Service {
- void method1();
- void method2();
- }
- interface ServiceFactory {
- Service getService();
- }
- class Implementation1 implements Service {
- private Implementation1() {}// 私有的,只能通过工厂方法来返回
- public void method1() {System.out.println("Implementation1 method1");}
- public void method2() {System.out.println("Implementation1 method2");}
- public static ServiceFactory factory = // 静态成员,只需一个工厂即可
- new ServiceFactory() {// 使用匿名类来实现工厂接口
- public Service getService() {
- // 但需多个业务对象,每次调用工厂方法都会获得一个业务实现对象
- return new Implementation1();
- }
- };
- }
- class Implementation2 implements Service {
- private 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 Factories {
- public static void serviceConsumer(ServiceFactory fact) {
- Service s = fact.getService();
- s.method1();
- s.method2();
- }
- public static void main(String[] args) {
- serviceConsumer(Implementation1.factory);
- serviceConsumer(Implementation2.factory);
- }
- }
修改后Implementation1与Implementation2的构造器都可以是private的,并且没有任何必要去创建具有具体名字的工厂类,另外,你经常只需要一个工厂对象即可,因此在本例中它被创建为Service实现的一个static域,这样更具有实际意义。修改后的程序是多么的完美!