`
schumee
  • 浏览: 24699 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Effective Java 学习笔记第1条 --- 考虑用静态工厂方法代替构造函数

阅读更多

静态工厂方法好处:

  1. 构造函数有命名的限制,而静态方法有自己的名字,更加易于理解。
  2. 静态工厂方法在每次调用的时候不要求创建一个新的对象。这种做法对于一个要频繁创建相同对象的程序来说,可以极大的提高性能。它使得一个类可以保证是一个singleton;他使非可变类可以保证“不会有两个相等的实例存在”。
  3. 静态工厂方法在选择返回类型时有更大的灵活性。使用静态工厂方法,可以通过调用方法时使用不同的参数创建不同类的实例,还可以创建非公有类的对象,这就封装了类的实现细节。

静态工厂方法坏处:

  1. 如果一个类是通过静态工厂方法来取得实例的,并且该类的构造函数都不是公有的或者保护的,那该类就不可能有子类(被继承),子类的构造函数需要首先调用 父类的构造函数,因为父类的构造函数是private的,所以即使我们假设继承成功的话,那么子类也根本没有权限去调用父类的私有构造函数,所以是无法被 继承的。
  2. 毕竟通过构造函数创建实例还是SUN公司所提倡的,静态工厂方法跟其他的静态方法区别不大,这样创建的实例谁又知道这个静态方法是创建实例呢?弥补的办法就是:静态工厂方法名字使用valueOf或者getInstance.

总结:

     静态工厂方法和公有的构造函数都有他们各自的用途,我们要理解他们各自的长处,避免一上来就用构造函数,通常静态工厂更加合适。如果没有其他因素强烈的影响我们的选择,最好还是简单的选择构造函数,毕竟他是语言提供的规范。

// Provider framework sketch
public abstract class Foo {
	// Maps String key to corresponding Class object
	private static Map implementations = null;

	// Initializes implementations map the first time it's called
	private static synchronized void initMapIfNecessary() {
		if (implementations == null) {
		implementations = new HashMap();
			// Load implementation class names and keys from
			// Properties file, translate names into Class
			// objects using Class.forName and store mappings.
			...
		}
	}

	public static Foo getInstance(String key) {
		initMapIfNecessary();
		Class c = (Class) implementations.get(key);
		if (c == null)
			return new DefaultFoo();
		try {
			return (Foo) c.newInstance();
		} catch (Exception e) {
			return new DefaultFoo();
		}
	}
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics