掌握Java设计模式之享元设计模式(12)

原创
2018/04/24 21:03
阅读数 185

1、概念

      在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建,这就是享元模式,类似与String在静态常量池中一样。

2、场景

1、系统有大量相似对象。

2、需要缓冲池的场景。

3、核心点

1、使用HashMap存储这些对象。

2、结合工厂类使用

3、注意划分外部状态和内部状态,否则可能会引起线程安全问题。内部状态就是常量数据就是a,不能更改,但是外部状态在前端页面显示a的时候,字体在不同页面可以显示不一样的字体和背景色。

4、代码实现

public interface School {
    void use();
}
public class XiaoSchool implements School {
    public String name;

    public String like;

    public XiaoSchool(String name){
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getLike() {
        return like;
    }

    public void setLike(String like) {
        this.like = like;
    }

    @Override
    public void use() {
        System.out.println("我叫"+name+",喜欢:"+like);
    }
}
public class SchoolFactory {
    private static final Map<String,XiaoSchool> maps = new HashMap<>();

    public static XiaoSchool getSchool(String name){

        XiaoSchool xiaoSchool = maps.get(name);
        if (xiaoSchool == null){
            xiaoSchool = new XiaoSchool(name);
            maps.put(name,xiaoSchool);
        }
        return xiaoSchool;
    }

    public static int getSize(){
        return maps.size();
    }

}

      main函数执行

public static void main(String[] args){
    String name = "杨幂";
    for (int i = 0; i<5;i++){
        XiaoSchool xiaoSchool = SchoolFactory.getSchool(name);
        xiaoSchool.setLike("胡歌");
        xiaoSchool.use();
        System.out.println(SchoolFactory.getSize());
    }
}

      结果

我叫杨幂,喜欢:胡歌
1
我叫杨幂,喜欢:胡歌
1
我叫杨幂,喜欢:胡歌
1
我叫杨幂,喜欢:胡歌
1
我叫杨幂,喜欢:胡歌
1

      结束:自己敲一遍代码就懂了,看是看不会的。

展开阅读全文
打赏
1
5 收藏
分享
加载中
更多评论
打赏
0 评论
5 收藏
1
分享
返回顶部
顶部