享元模式:避免大量相同开销

当系统中存在大量相似对象时,使用享元模式可以有效地减少内存的使用和对象的创建数量。享元模式是一种结构型设计模式,通过共享已经存在的对象来减少内存使用和对象创建的数量。

享元模式的核心思想是将可复用的对象缓存起来,在需要时直接从缓存中获取,而不是重新创建一个新的对象。这些可复用的对象通常会被设计为不可变的,因此可以被多个客户端共享。

具体实现时,通常会创建一个工厂类来管理所有的享元对象,并在需要时返回已有的对象或者创建新的对象。同时,对于那些频繁使用但不易生成的对象,可以考虑提前生成并缓存起来,以便更快地响应客户端请求。

在Java中,String类 就是一个典型的享元模式的例子。由于String对象是不可变的,因此可以被多个客户端共享。当我们需要创建一个新的字符串时,如果该字符串已经存在于缓存池中,那么就直接返回该字符串的引用,否则就创建一个新的字符串并加入到缓存池中。

总之,享元模式可以帮助我们有效地减少内存使用和对象创建的数量,特别是在需要创建大量相似对象的场景下,使用享元模式可以极大地提高系统的性能和可维护性。

示例代码:

import java.util.HashMap;
import java.util.Map;

/**
 * 享元模式示例代码
 */
public class FlyweightDemo {
    /**
     * 抽象享元类
     */
    interface Shape {
        void draw();
    }

    /**
     * 具体享元类
     */
    static class Circle implements Shape {
        private String color; // 颜色
        private int x; // x坐标
        private int y; // y坐标
        private int radius; // 半径

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

        @Override
        public void draw() {
            System.out.println("画了一个" + color + "圆形,半径为:" + radius + ",坐标为(" + x + "," + y + ")");
        }

        public void setX(int x) {
            this.x = x;
        }

        public void setY(int y) {
            this.y = y;
        }

        public void setRadius(int radius) {
            this.radius = radius;
        }
    }

    /**
     * 享元工厂类
     */
    static class ShapeFactory {
        private static final Map<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("创建了一个" + color + "圆形对象");
            } else {
                System.out.println("使用了一个" + color + "圆形对象");
            }
            return circle;
        }
    }

    /**
     * 客户端
     */
    public static void main(String[] args) {
        Shape redCircle = ShapeFactory.getCircle("红色");
        redCircle.setX(10);
        redCircle.setY(20);
        redCircle.setRadius(30);
        redCircle.draw();

        Shape blueCircle = ShapeFactory.getCircle("蓝色");
        blueCircle.setX(100);
        blueCircle.setY(200);
        blueCircle.setRadius(300);
        blueCircle.draw();

        Shape greenCircle = ShapeFactory.getCircle("绿色");
        greenCircle.setX(1000);
        greenCircle.setY(2000);
        greenCircle.setRadius(3000);
        greenCircle.draw();
    }
}
posted @ 2023-04-24 15:06  穆海如枫  阅读(33)  评论(0)    收藏  举报