设计模式-享元模式

享元模式

摘要:当有大量对象即将被创建时,很可能重复创建相同的对象,如果每使用一次就进行一次对象的创建,那么这些对象就会消耗大量内存。此时我们可以将其中相同的部分抽象出来进行存储,当使用相同对象时就无需创建,直接进行使用就可。

意图:运用共享技术有效地支持大量细粒度的对象
主要解决;需要创建大量对象,防止造成内存溢出
如何解决:用唯一标识码判断,如果内存中有,则返回这个唯一标识码所标识的对象
关键代码:用HashMap来对对象进行存储
优点:大大减少对象的创建,降低系统的内存,使效率提高
缺点:提高系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不应该随着内存状态的变化而变化,否则会造成系统的混乱。
使用场景:系统有大量对象;需要缓冲池的场景。

代码实现

首先还是像以前一样,用一个Shape来作为要创建的对象的接口。其中,有一个draw方法,用来展示不同对象的动作。

public interface Shape {
    void draw();
}

接着来画一个圆,创建一个Circle类来实现Shape接口,并且实现其中的draw()方法。

public class Circle implements Shape {
    private String color;

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

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

    @Override
    public void draw() {
        System.out.println("Circle's color is : " + color);
    }
}

接下来就是享元模式的关键代码,那就是进行对象的管理。代码如下所示;

public class ShapeFactory {
    private static final HashMap<String, Shape> circleMap = new HashMap<>();

    public static Shape getCircle(String color) {
        Circle circle = (Circle) circleMap.get(color);

        if (circle == null) {
            circle = new Circle(color);
            circleMap.put(color, circle);
            System.out.println("Add the object of " + color);
        }
        return circle;

    }
}

ShapeFactory的作用主要是对Shape对象进行管理,只不过这里是仅仅对Circle对象进行了处理。但是如果有其他的Shape的实现,可以创建多个对象。主要的思想就是如果在HashMap中有所需的对象,就直接对其进行返回;如果没有该对象,则对其进行创建,并且进行存储,方便后面进行使用。
接下来就是对这个ShapeFactory的使用了。

public class FlyWeightDemo {
    private static final String colors[] = {"green", "red", "blue", "black", "white"};

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            Circle circle = (Circle) ShapeFactory.getCircle(getRandomColor());
            circle.draw();
        }

    }

    private static String getRandomColor() {
        return colors[(int) (Math.random() * colors.length)];
    }
}

通过10次循环,来对5中颜色的对象进行随机调用,主要的实现逻辑还是ShapeFactory的相关实现。FlyWeightDemo的运行结果如下所示:

Add the object of red
Circle's color is : red
Circle's color is : red
Add the object of black
Circle's color is : black
Circle's color is : black
Add the object of blue
Circle's color is : blue
Add the object of white
Circle's color is : white
Circle's color is : red
Add the object of green
Circle's color is : green
Circle's color is : white
Circle's color is : red

可以看到,每当第一次对对象进行调用时,则会对对象进行创建,在时候就不需要再重复进行创建了。当有大量的对象需要创建时,使用享元模式无疑会给我们带来很大的便利。

Tips

简单总结一下,享元模式能够在一定程度上带来便利。适用场景是当需要创建大量的数据时,并且可能还会重复对某些对象进行调用。享元模式核心内容就是通过HashMap来对创建的对象进行管理,有则取之,无则创建

posted @   忠肝义胆-多隆  阅读(16)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
点击右上角即可分享
微信分享提示