ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

设计模式-享元模式

2021-09-24 11:02:43  阅读:98  来源: 互联网

标签:享元 String innerState 模式 System println 设计模式 public


享元模式

定义

  • 使用共享对象有效地支持大量的细粒度对象,类似线程池,本质是缓存共享对象

举例

通用结构

  • 抽象享元角色Flyweight:享元对象接口,定义对象的外部状态和内部状态
  • 具体享元角色Concrete Flyweight:享元对象实现,该角色的内部状态处理应于外部状态无关
  • 享元工厂Flyweight Factory: 负责管理享元对象池和创建享元对象
public interface IFlyweight {
    void operation(String existState);
}

public class ConcreteFlyweight implements IFlyweight{

    private final String innerState;

    public ConcreteFlyweight(String innerState){
        this.innerState = innerState;
    }

    @Override
    public void operation(String existState) {
        System.out.println(String.format("Object Address: %s, innerState: %s, existState: %s",
                System.identityHashCode(this),this.innerState,existState));
    }
}

public class FlyweightFactory {

    private static final Map<String,IFlyweight> pool = new ConcurrentHashMap<>();

    public static IFlyweight getFlyweight(String innerState){
        if (!pool.containsKey(innerState)){
            pool.put(innerState,new ConcreteFlyweight(innerState));
        }
        return pool.get(innerState);
    }
}
public class Test {

    @Test
    public void testGetFlyweight(){
        IFlyweight flyweight = FlyweightFactory.getFlyweight("a");
        IFlyweight flyweight2 = FlyweightFactory.getFlyweight("a");
        IFlyweight flyweight3 = FlyweightFactory.getFlyweight("b");
        flyweight.operation("1");
        flyweight2.operation("2");
        flyweight3.operation("3");
    }
}

源码应用

JDK中的String:

JVM的字符串常量保存于字符串常量池中,JDK 7.0版本由永生代迁至堆中。

如果以字面量的形式创建String,JVM编译器就会把它保存在字符串常量池中,常量池中有且只有一份相同的字面量,如果有其他相同的字面量,则会返回这个引用

  public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "hello";
        String s3 = "hel" + "lo";
        String s4 = "hel";
        String s5 = "lo";
        String s6 = s4 + s5;
        final String s7 = "hel";
        final String s8 = "lo";
        String s9 = s7 + s8;
        String s10 = new String("hello");
        String s11 = s10.intern();
        System.out.println(s1 == s2);
        System.out.println(s1 == s3);
        System.out.println(s1 == s6);
        System.out.println(s1 == s9);
        System.out.println(s1 == s10);
        System.out.println(s1 == s11);
    }

JDK中的Interger:

Interger内部缓存了一个-128 至127的常量池,valueOf方法会返回在这期间的值

public static void main(String[] args) {
    Integer a = Integer.valueOf(100);
    Integer b = 100;
    Integer c = Integer.valueOf(128);
    Integer d = 128;
    System.out.println(a == b);
    System.out.println(c == d);
}

个人心得

  • 适合需要大量创建对象的场景,降低系统内存消耗
  • 需要关注对象的内外部状态、线程安全等问题,复杂度增加

标签:享元,String,innerState,模式,System,println,设计模式,public
来源: https://blog.csdn.net/weixin_47313214/article/details/120450808

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有