享元模式的主要目的是通过共享对象来减少内存消耗,特别是在需要创建大量相似对象的情况下。它通过将对象的共享部分提取出来,以减少对象的数量并节省内存。
在享元模式中,对象被分为两部分:内部状态和外部状态。内部状态是对象共享的一部分,不会因为不同对象而变化。而外部状态是对象的可变部分,会因为不同对象而有所不同。
通过将对象的内部状态和外部状态分离,我们可以在需要时共享内部状态,并在运行时动态设置外部状态,从而实现对象的复用。
下面是一个简单的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