设计模式之享元模式

享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度的对象。用于减少创建对象的数量,以减少内存占用和提高性能。

一、享元模式

在软件开发过程中,如果有使用大量相同的对象,只要共享一个就可以,这就是享元模式,减少了不必要的内存消耗,其UML图如下所示:

这里写图片描述

享元模式由以下部分组成:

抽象享元类(Flyweight): 所有具体享元类的超类或者接口,通过这个接口,Flyweight可以接受并作用于外部专题。

具体享元类(ConcreteFlyweight):指定内部状态,为内部状态增加存储空间。

享元工厂类(FlyweightFactory):用来创建并管理Flyweight对象,它主要用来确保合理地共享Flyweight,当用户请求一个Flyweight时,FlyweightFactory就会提供一个已经创建的Flyweight对象或者新建一个(如果不存在)。

二、案例分析

我们以画出不同颜色的圆形为例,简单分析一下享元模式。

抽象享元类–Shape

interface Shape{
    public void operation();
}

具体享元类:

class Circle implements  Shape{
    private String color;

    public Circle(String color) {
        this.color = color;
    }

    @Override
    public void operation() {
        System.out.println("我是"+color+"的圆形。");
    }
}

享元工厂类:

class ShapeFactory{

    private static final HashMap<String,Shape> Circles= new HashMap<>();

    public static Shape getCircle(String color){
        Circle c= (Circle)Circles.get(color);
        if(c == null){
            c = new Circle(color);
            Circles.put(color,c);
            c.operation();
        }
        return c;
    }

    public static int getMapSize(){
        return Circles.size();
    }

}

客户端调用:

public class Test {
    public static void main(String[] args) {
        ShapeFactory.getCircle("红色");
        ShapeFactory.getCircle("蓝色");
        ShapeFactory.getCircle("绿色");
        ShapeFactory.getCircle("绿色");
        ShapeFactory.getCircle("红色");
        ShapeFactory.getCircle("红色");
        System.out.println("对象池的长度为"+ShapeFactory.getMapSize());
    }
}

运行结果(代码亲测,可以通过):

这里写图片描述

代码地址:Flyweight

如上例所示,使用工厂模式配合,在这个对象池(HashMap)中,第一次使用的时候创建对象,之后每次都是在调用这个对象,而不会重新创建。

三、模式结语

享元模式的优点:

  • 享元模式的优点在于它能够极大的减少系统中对象的个数。

  • 享元模式由于使用了外部状态,外部状态相对独立,不会影响到内部状态,所以享元模式使得享元对象能够在不同的环境被共享。

享元模式的使用场景:

  • 一个系统中存在大量的相同或者相似的对象,过量使用会造成系统内存的耗费,可以使用享元模式来减少系统中对象的数量。

  • 对象的大部分状态都可以外部化,可以将这些外部状态传入对象中。

欢迎大家评论留言,点击查看更多设计模式

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值