阅读总结。
1.用静态工厂方法替代构造器
优点:
1.1 静态工厂方法有名称,比较好理解方法的含义。
1.2 静态工厂可以返回单例对象。
1.3 静态工厂方法可以返回任何父类型的子类型对象(比如下面的服务提供者框架中展示的)。
package effective.java.chapter1;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* @author E-mail: hwy1782@gmail.com
* @date : 2013-2-27 上午10:29:14
*
*/
public class Services {
private static final Map<String,Provider> providers = new ConcurrentHashMap<String, Provider>();
private static final String DEFAULT_PROVIDER_NAME = "<def>";
public static void initProviders(String name,Provider provider){
providers.put(name, provider);
}
public static void initProviders(Provider p) {
initProviders(DEFAULT_PROVIDER_NAME, p);
}
public static Service getServiceInstance(String name) {
Provider p = providers.get(name);
if(p == null){
throw new IllegalArgumentException("no provider register with name : "+name);
}
return p.provider();
}
public static Service getServiceInstance(){
return providers.get(DEFAULT_PROVIDER_NAME).provider();
}
}
package effective.java.chapter1;
/**
* @author E-mail: hwy1782@gmail.com
* @date : 2013-2-27 上午10:28:46
*
*/
public interface Provider {
Service provider();
}
package effective.java.chapter1;
/**
* @author E-mail: hwy1782@gmail.com
* @date : 2013-2-27 上午10:28:20
*
*/
public interface Service {
void service();
}
服务提供者框架中存在三个部分:
1.服务提供者(provider):注册服务,需要使用的服务在这个类里面注册。
2.服务接口(service):对外提供的服务,客户端调用这个接口就可以执行相应的服务。
3.服务访问api(services):客户端用来获取服务的实例。
1.4 创建参数化实例的时候,代码更简洁:
import com.google.common.collect.Maps;
Map<String,String> maps = Maps.newHashMap();
2.构造函数中参数较多的时候,可以考虑使用build模式
package desigenPattern.factory;
/**
* @author E-mail: hwy1782@gmail.com
* @date : 2013-2-21 上午10:35:53
*
* Build 构造器模式
*
* build 构造器模式: 使用内部静态类
*
* 当类的构造器或者静态工厂中有多个参数,采用构造器模式不错
*
*/
public class Computer {
private String name;
private String type;
private double screenSize;
private String produceDate;
private double price;
public static class Build{
private String name;
private String type;
private double screenSize;
private String produceDate;
private double price;
Build(String name,String type){
this.name = name;
this.type = type;
}
public Build screenSize(double size) {
this.screenSize = size;
return this;
}
public Build produceDate(String date) {
this.produceDate = date;
return this;
}
public Build price(double price) {
this.price = price;
return this;
}
public Computer build(){
return new Computer(this);
}
}
private Computer(Build build) {
this.name = build.name;
this.type = build.type;
this.screenSize = build.screenSize;
this.produceDate = build.produceDate;
this.price = build.price;
}
@Override
public String toString() {
return "[computer name = "+name+" type = "+type+" screenSize = "+screenSize+" price "+
price+" produceDate "+produceDate+"]";
}
}
3.使用私有构造器、或者枚举强化单例属性。
4.通过私有构造器,强化不能实例化能力。(比如一些工具类uitl就不需要实例化)
5.避免创建不必要的对象。(要优先使用基本类型而不是装箱基本类型,避免无意识的装箱)
6.消除过期引用:(一般而言只要类自己管理内存就要考虑这个问题)。
7.避免使用finalizer方法。