工厂方法模式的扩展(二):替代单例模式 & 产品对象重复使用

时光总嘲笑我的痴心妄想 提交于 2019-12-10 09:09:15

工厂方法模式的扩展(二):替代单例模式 & 产品对象重复使用

这篇博客介绍下工厂方法模式的另外两种扩展:代替单例模式以及产品对象重复使用。

这两种扩展体现了一种思想:经常使用或全局共享以及必要情况下,没必要销毁对象

1. 代替单例模式

与其说代替单例模式,到不如所是用工厂模式实现单例模式。

                            

对应代码如下:注意,构造器被私有化,工厂方法使用反射创建对象时要注意进行设置

public class Singleton {

    private Singleton(){}
    public void method(){
        ...
    }
}


public class SingletonFactory {

    private static Singleton singleton;

    static{
        try{
            Class c = Class.forName(Singleton.class.getName());

            Constructor constructor = c.getDeclaredConstructor();

            constructor.setAccessible(true);

            singleton = (Singleton)constructor.newInstance();
        } catch (Exception e){

        }
    }

    public static Singleton getInstance(){
        return singleton;
    }
}

这样的方式使用了变形后的饿汉式的单例模式。可以扩展这个工厂,使用这个工厂产生所有的单例。

扩展的方式(个人的想法):

  1. 将要产生单例的类写入配置文件,工厂的静态初始化块创建所有配置好的类的单例,然后保存在Map中,每次调用getInstance时仅需要输入一个类名,通过Map映射到单例对象上
  2. 和上面的做法一样,将单例用Map存储,但是不使用静态初始化;每次调用getInstance时,仍需要传入类名,在Map中找,如果没有找到则通过反射创建单例。其实这种方式是下面要介绍的产品对象的重复使用。

2. 产品对象的重复使用

将简单工厂与产品类间了依赖关系变为聚合关系,也就是说,工厂要保存产品对象的引用,这样,在下一次创建同类产品时,就可以直接返回这个对象的引用。

                        

public class ProductFatory{
    private static final Map<String, Product> prMap = new HashMap();
    public static synchronized Product createProduct(String type) throws Exception{
        Product product = null;
        if(prMap.containsKey(type)){
            product = prMap.get(type);
        }else{
            //第一次创建,可以通过反射,也可以通过其他方式

            prMap.put(type, product);
        }
        return product;
    }
}

有没有发现这种方式和单例模式“异曲同工”,使用synchronized是为了线程安全,这里当然可以选择“双检索”的方式提高效率。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!