工厂方法模式
定义:
定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
例子(女娲造人):
类图:
代码:
public class HumanFactory {
//定义一个MAP,初始化过的Human对象都放在这里
private static HashMap<String,Human> humans = new HashMap<String,Human>();
//定一个烤箱,泥巴塞进去,人就出来,这个太先进了
public static Human createHuman(Class c){
Human human=null; //定义一个类型的人类
try {
//如果MAP中有,则直接从取出,不用初始化了
if(humans.containsKey(c.getSimpleName())){
human = humans.get(c.getSimpleName());
}else{
human = (Human)Class.forName(c.getName()).newInstance();
//放到MAP中
humans.put(c.getSimpleName(), human);
}
} catch (InstantiationException e) {
//你要是不说个人类颜色的话,没法烤,要白的黑,你说话了才好烤
System.out.println("必须指定人类的颜色");
} catch (IllegalAccessException e) {
//一定定义的人类有问题,那就烤不出来了,这是...
System.out.println("人类定义错误!");
} catch (ClassNotFoundException e) {
//你随便说个人类,我到哪里给你制造去?!
System.out.println("混蛋,你指定的人类找不到!");
}
return human;
}
}
总结:
HumanFatcory是一个工厂,主要用来生产人类,当高层代码需要获取人类时,直接从工厂获取。同时这里使用了延迟初始化,一个对象初始化完毕后就不释放,等到再次用到得就不用再次初始化了,直接从内存过中拿到就可以。