工厂方法模式的扩展(二):替代单例模式 & 产品对象重复使用
这篇博客介绍下工厂方法模式的另外两种扩展:代替单例模式以及产品对象重复使用。
这两种扩展体现了一种思想:经常使用或全局共享以及必要情况下,没必要销毁对象
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;
}
}
这样的方式使用了变形后的饿汉式的单例模式。可以扩展这个工厂,使用这个工厂产生所有的单例。
扩展的方式(个人的想法):
- 将要产生单例的类写入配置文件,工厂的静态初始化块创建所有配置好的类的单例,然后保存在Map中,每次调用getInstance时仅需要输入一个类名,通过Map映射到单例对象上
- 和上面的做法一样,将单例用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是为了线程安全,这里当然可以选择“双检索”的方式提高效率。
来源:CSDN
作者:小码农丨
链接:https://blog.csdn.net/qq2071114140/article/details/103465458