Dotcpp  >  编程教程  >  结构型模式(Structural Patterns)  >  享元模式

享元模式

点击打开在线编译器,边学边练

享元模式的主要目的是通过共享对象来减少内存消耗,特别是在需要创建大量相似对象的情况下。它通过将对象的共享部分提取出来,以减少对象的数量并节省内存。

在享元模式中,对象被分为两部分:内部状态和外部状态。内部状态是对象共享的一部分,不会因为不同对象而变化。而外部状态是对象的可变部分,会因为不同对象而有所不同。

享元模式

通过将对象的内部状态和外部状态分离,我们可以在需要时共享内部状态,并在运行时动态设置外部状态,从而实现对象的复用。

下面是一个简单的Java示例,展示了如何使用享元模式:

import java.util.HashMap;
import java.util.Map;
public 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("Creating circle of color : " + color);
        }
        return circle;
    }
}
public abstract class Shape {
    abstract void draw();
}
public class Circle extends Shape {
    private String color;
    public Circle(String color) {
        this.color = color;
    }
    @Override
    void draw() {
        System.out.println("Drawing circle of color : " + color);
    }
}
public class FlyweightPatternDemo {
    private static final String[] colors = { "Red", "Green", "Blue", "Yellow", "Black" };
    public static void main(String[] args) {
        for (int i = 0; i < 20; i++) {
            Circle circle = (Circle) ShapeFactory.getCircle(getRandomColor());
            circle.setX(getRandomX());
            circle.setY(getRandomY());
            circle.draw();
        }
    }
    private static String getRandomColor() {
        return colors[(int) (Math.random() * colors.length)];
    }
    private static int getRandomX() {
        return (int) (Math.random() * 100);
    }
    private static int getRandomY() {
        return (int) (Math.random() * 100);
    }
}

在这个示例中,ShapeFactory是享元工厂类,用来创建和管理共享的Circle对象。每次通过getCircle()方法获取Circle对象时,首先从一个内部Map中查找是否已经创建了相应颜色的Circle对象。如果找到了就直接返回,否则就创建一个新的Circle对象,并将其存储在Map中,以便下次使用。

通过使用享元模式,我们可以在需要时共享对象,从而减少内存消耗。这种方式特别适用于需要创建大量相似对象的情况,可以大大提升系统的性能和效率。


本文固定URL:https://www.dotcpp.com/course/1372

上一课:

外观模式

下一课:

代理模式

Dotcpp在线编译      (登录可减少运行等待时间)