Java设计模式之享元模式

享元模式

介绍

享元模式(Flyweight Pattern),Flyweight是“轻量级”的意思,指的是拳击比赛中选手体重最轻的等级。顾名思义,该设计模式的作用是为了让对象变“轻”。一言以蔽之,就是“通过尽量共享实例来避免new出实例”。享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能。

实现

在享元模式中有以下登场角色。

  • Flyweight(轻量级)
    按照通常方式编写程序会导致程序变重,所以如果能够共享实例会比较好,而Flyweight角色表示的就是那些实例会被共享的类。
  • FlyweightFactory(轻量级工厂)
    FlyweightFactory角色是生成Flyweight角色的工厂。在工厂中生成Flyweight角色可以实现共享实例。
  • Client(请求者)
    Client角色使用FlyweightFactory角色来生成Flyweight角色。

享元模式的通用类图如下:
享元模式类图

享元模式代码实现如下:

  • Flyweight类
    public class Flyweight { 
    private String type;
    public Flyweight(String type) {
    this.type = type;
    System.out.println("Flyweight type : " + this.type + " created;");
    }
    public void method() {
    System.out.println("Flyweight type : " + this.type + " do something...");
    }
    }
  • FlyweightFactory类
    public class FlyweightFactory { 
    private static Map<String, Flyweight> map = new ConcurrentHashMap<String, Flyweight>();
    public static Flyweight getFlyweight(String type) {
    Flyweight flyweight = map.get(type);
    if (null == flyweight) {
    flyweight = new Flyweight(type);
    map.put(type, flyweight);
    }
    return flyweight;
    }
    }
  • Client类
    public class Client { 
    public static void main(String[] args) {
    Random random = new Random();
    for (int i = 0; i < 5; i++) {
    int type = random.nextInt(4);
    Flyweight flyweight = FlyweightFactory.getFlyweight(String.valueOf(type));
    flyweight.method();
    }
    }
    }
  • 输出结果
    Flyweight type : 3 created; 
    Flyweight type : 3 do something...
    Flyweight type : 1 created;
    Flyweight type : 1 do something...
    Flyweight type : 1 do something...
    Flyweight type : 3 do something...
    Flyweight type : 1 do something...

    可以看出,type为3的Flyweight被使用了2次,但只创建了一次实例;type为1的Flyweight被使用了3次,但只创建了一次实例。减少了内存的开销。
总结
  • 享元模式适用场景
    1. 系统中有大量对象。
    2. 这些对象消耗大量内存。
    3. 这些对象的状态大部分可以外部化。
    4. 这些对象可以按照内蕴状态分为很多组,当把外蕴对象从对象中剔除出来时,每一组对象都可以用一个对象来代替。
    5. 系统不依赖于这些对象身份,这些对象是不可分辨的。
  • 优点
    1. 大大减少对象的创建,降低系统的内存,使效率提高。
  • 缺点
    1. 提高了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不应该随着内部状态的变化而变化,否则会造成系统的混乱。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值