工厂方法模式和抽象工厂模式

作者 knight 日期 2018-01-20
工厂方法模式和抽象工厂模式

前几天刚写了反射,工厂模式也是用到了反射实现。上次写到为了保证一类指标一种结果我用到了单例模式,其实工厂方法模式中有个延迟始化的应用也能够实现这一需求。

工厂方法模式【Factory Method Pattern】

定义:工厂方法模式又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂模式(Polymorphic Factory),在工厂方法模式中,父类负责定义创建对象的公共接口,而子类则负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成,即由子类来决定究竟应该实例化(创建)哪一个类。
工厂方式法模式(Factory Method),定义了一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到子类。

工厂方法模式有一个非常重要的应用,就是延迟始化(Lazy initiali zation),
一个对象初始化完毕后就不释放,等到再次用到得就不用再次初始化了,直接从内存过中拿到就可以了,看例子:

package com.cbf4life.advance;

import java.util.HashMap;

@SuppressWarnings("all")
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;
    }
}

这个在类初始化很消耗资源的情况比较实用,比如你要连接硬件 ,或 者 是 为 了 初 始 化 一 个 类 需 要 准 备 比 较 多 条 件( 参数 ),通 过 这 种 方 式 可 以 很 好 的 减 少 项 目 的 复 杂 程 度 。