[Effective Java]考虑用静态工厂方法代替构造器(二)

2014-11-23 19:47:21 · 作者: · 浏览: 20
 
 
// Service provider framework sketch - Service provider interface 
package com.xjtu.cruise.chapter02.item01;

public interface Provider {
	Service newService();
}
 
 
// Simple test program for service provider framework

package com.xjtu.cruise.chapter02.item01;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Services.registerDefaultProvider(DEFAULT_PROVIDER);
		Services.registerProvider("comp", COMP_PROVIDER);
		Services.registerProvider("armed", ARMED_PROVIDER);

		Service s1 = Services.newInstance();
		Service s2 = Services.newInstance("comp");
		Service s3 = Services.newInstance("armed");
		System.out.printf("%s %s %s\n", s1, s2, s3);
	}	
	
	private static Provider DEFAULT_PROVIDER = new Provider() {
		@Override
		public Service newService() {
			return new Service() {
				@Override
				public String toString() {
					return "Default service";
				}
			};
		}
	};
	
	
	private static Provider COMP_PROVIDER = new Provider() {
		@Override
		public Service newService() {
			return new Service() {
				@Override
				public String toString() {
					return "Complementary service";
				}
			};
		}
	};
	
	
	private static Provider ARMED_PROVIDER = new Provider() {
		@Override
		public Service newService() {
			return new Service() {
				@Override
				public String toString() {
					return "Armed service";
				}
			};
		}
	};

}


但是,我们也应该很清楚的认识到使用静态工厂方法带来的隐患:

1. 如果类中没有提供public或protected的构造器,将造成该类不能子类化

  不能子类化在某些情况下是无法接受的,但是,这样也有好处:策略模式教导我们应该多用组合而不是继承,当一个类不能子类化后,组合将是你唯一的选择。

  

2. 静态工厂方法和其他静态方法本质上并没有区别

  前已经述及,静态工厂方法本质上就是一个静态方法。这使得使用人员在查阅JavaDoc时,可能将其和一般的静态方法混淆,造成使用上的困扰。

总结:

  鉴于构造器有各种各样的不便,可以考虑用静态方法代替。它会给我们带来以下优缺点:

   优点:

    1) 有名称;

    2)不必在每一次创建时都提供新对象;

    3) 返回子类型;

    4) 使代码更加简单。

   缺点:

    1)如果类中没有提供public或protected的构造器,将造成该类不能子类化;

    2)静态工厂方法和其他静态方法本质上并没有区别。