前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >享元模式

享元模式

作者头像
晚上没宵夜
发布2022-05-09 21:13:32
1860
发布2022-05-09 21:13:32
举报
文章被收录于专栏:Howl同学的学习笔记

团建去吃火锅了,回来没时间写笔记,发篇以前写过的设计模式把

1. 享元模式

享元模式是一个重用现有对象来减少内存占用和提高性能的模式,有点类似单例模式,但是享元可以创建多个不同的对象。主要思路是用一个 HashMap 来存放已经创建的对象(每个对象有唯一标识),每次创建对象前先查找 HashMap。String 的缓存池,数据库的数据池都是享元模式的体现

享元模式的组成:

  • Flyweight: 享元对象(下面举例的dog对象)
  • IntrinsicState: 共享内部状态(name 是共享的)
  • ExtrinsicState: 每个享元对象的外部状态各不同(say 是不同的)

2. 过程

2.1 享元接口

代码语言:javascript
复制
public interface Animal {
    void say(String say);
}

2.2 享元对象

代码语言:javascript
复制
public class Dog implements Animal {

    private String name;

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

    @Override
    public void say(String say) {
        System.out.println("I am dog " + name + ", i want to say: " + say);
    }
}

2.3 享元工厂

代码语言:javascript
复制
public class AnimalFactory {
    private static final HashMap<String, Animal> hashMap = new HashMap<>();

    public static Animal getAnimal(String name) {
        if(!hashMap.containsKey(name)) {
            Animal animal = new Dog(name);
            hashMap.put(name, animal);
        }
        return hashMap.get(name);
    }
}

2.4 测试

代码语言:javascript
复制
public static void main(String[] args) {
    Animal animal1 = AnimalFactory.getAnimal("1");
    Animal animal2 = AnimalFactory.getAnimal("2");
    Animal animal3 = AnimalFactory.getAnimal("1");
    
    animal1.say("1");		// I am dog 1, i want to say: 1
    animal2.say("2");		// I am dog 2, i want to say: 2
    animal3.say("3");		// I am dog 1, i want to say: 3
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-08-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 享元模式
  • 2. 过程
    • 2.1 享元接口
      • 2.2 享元对象
        • 2.3 享元工厂
          • 2.4 测试
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档