享元模式:局部单例模式。
文章目录
- 享元模式:局部单例模式。
- 前言
- 一、享元模式的作用
- 二、如何实现享元模式
- 总结
前言
享元模式其实很简单,但是如果用好,确实可以达到减少内存,事半功倍的效果;适合 系统要创建大量相似对象,相同对象等;
一、享元模式的作用
1 享元模式可以解决对象的重复创建问题,为什么说是局部单例? 因为他不是全局单例,仅仅是在调用某个方法的时候,才会获取到同一个对象;
2 但是它在这个小范围内确实是单例的,获取的一直都是同一个对象;
二、如何实现享元模式
例如: 我现在想创建一个(一类)对象,我不去直接创建,类似于弄个工厂的感觉,去创建对象,然后根据入参,创建出我想要的一个(一类)对象
开始编码:
- 创建对象的标准类
public interface XYBean {
public String getName();
}
- 具体对象类
public class XYBean1 implements XYBean{
private String name;
@Override
public String getName() {
return null;
}
public void setName(String name) {
this.name = name;
}
public XYBean1(String name) {
this.name = name;
}
public XYBean1() {
System.out.println("我被初始化了");
}
}
- 类似创建对象的工厂
public class CreateBean {
private Map<String, XYBean> map = new HashMap<>();
public XYBean create(String name) {
if (!map.containsKey(name)) {
map.put(name, new XYBean1());
}
return map.get(name);
}
}
1 map 相当于每次将创建的对象缓存起来
2 通过create方法创建的对象,只有第一次是创建的,之后每次都是从缓存中获取的同一个对象;
- 测试类
public class Test {
public static void main(String[] args) {
CreateBean createBean = new CreateBean();
XYBean xyBean = createBean.create("xy");
System.out.println(xyBean);
System.out.println(createBean.create("xy"));
System.out.println(createBean.create("xy"));
System.out.println(createBean.create("xy"));
System.out.println(createBean.create("xy"));
}
}
1 可以看到只有第一次调用的时候,XYBean1的构造方法才会被调用,之后不会在调用了
2 可以看到每次打印的对象地址,都是同一个对象,无论如何调用这个工厂的创建方法,返回的都是同一个对象—局部单例
总结
享元模式的思想就是 将创建的好的对象,利用缓存达到只创建一次,之后无论如何调用,都不会重复创建的目的,代码相对简单,需要找到适合此种模式的场景;
设计模式没有高低贵贱之分,只有是否合适场景之分;