设计模式 - 简单工厂模式(静态工厂模式)

简单工厂模式(静态工厂模式): 类提供一个公有的静态工厂方法,返回一个类的的实例.

案例1: Java 中基本类型的包装类工厂方法:

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}
案例2: 一个类的继承层次中,Employee 是父类,子类有 Engineer, Sales, Manager, 可以在Employee类添加一个参数化的创建方法来创建子类实例:

static Employee create(String className) { //className "Engineer", "Sales" or "Manager"
	try { 
		return (Employee) Class.forName(className).newInstance();
	} catch(Exception e) {
		throw new IllegalArgumentException("Unable to instantiate " + className);
	}	

}
案例3: 单件模式, 如log4j API
public static Logger getLogger(String name)

静态工厂方法相对于公有构造器优势有:

1. 它有名字,可以确切的描述返回的对象; 构造器名字相同,如果有两个构造器,他们的参数列表的类型一样,只是顺序不一样,无法记住该用哪个构造器;

2. 不必每次调用的时候都创建一个新对象,如单件模式创建全局对象; 对象缓存技术, 如:

多个订单Order属于一个客户Customer,将客户对象缓存到一个Map对象中<name, customer>, 使用时先根据name从Map对象中查找,如果没有再创建,然后缓存起来。

public class CustomerService{
    private static Map<String,Customer> customers = new HashMap<String, Customer>();
    public static createCustomer(String name) {
	Customer customer = customers.get(name);
	if(customer != null) return customer;
	if(customer == null) {
	    customer = new Customer(name);
	    customers.put(name, customer);
	    return customer;
	} 
    }	
}
3. 可以返回原返回类型的任何子类, 如Java的Collections集合接口提供了不可修改的的集合、同步集合等

<T> Set<T> java.util.Collections.unmodifiableSet(Set<? extends T> s)





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值