享元模式(Flyweight Pattern)
背景介绍:
小胖子决定在披萨店推出一个新的服务,允许顾客在披萨上加入个性化的图案或文字。然而,为了提高效率和减少内存占用,小胖子决定引入享元模式,通过共享相同的图案和文字对象,减少重复创建相似对象的开销。
设计模式应用:
享元模式
为了减少相似对象的创建开销,小胖子引入了享元模式。他创建了一个图案和文字的享元工厂,通过工厂来共享相同的图案和文字对象。每个披萨对象只需要保存一个对共享对象的引用,从而降低内存占用和提高效率。
代码示例:
import java.util.HashMap;
import java.util.Map;
// 图案和文字接口
interface Pattern {
void draw(String color);
}
// 具体图案类 - 圆形
class Circle implements Pattern {
private String shape = "Circle";
@Override
public void draw(String color) {
System.out.println("绘制 " + color + " 的 " + shape);
}
}
// 具体图案类 - 方形
class Square implements Pattern {
private String shape = "Square";
@Override
public void draw(String color) {
System.out.println("绘制 " + color + " 的 " + shape);
}
}
// 享元工厂
class PatternFactory {
private Map<String, Pattern> patternMap = new HashMap<>();
// 获取图案对象
public Pattern getPattern(String shape) {
Pattern pattern = patternMap.get(shape);
if (pattern == null) {
// 如果不存在,则创建一个新的图案对象,并放入享元工厂中
if (shape.equalsIgnoreCase("circle")) {
pattern = new Circle();
} else if (shape.equalsIgnoreCase("square")) {
pattern = new Square();
}
patternMap.put(shape, pattern);
}
return pattern;
}
}
// 客户端
public class FlyweightPatternExample {
public static void main(String[] args) {
// 创建享元工厂
PatternFactory patternFactory = new PatternFactory();
// 获取图案对象并绘制
Pattern circle1 = patternFactory.getPattern("circle");
circle1.draw("red");
// 再次获取相同的图案对象,并绘制不同颜色
Pattern circle2 = patternFactory.getPattern("circle");
circle2.draw("blue");
// 获取另一种图案对象并绘制
Pattern square = patternFactory.getPattern("square");
square.draw("green");
}
}
通过享元模式减少重复对象
在这个例子中,享元模式帮助小胖子减少相似对象的创建开销。通过创建一个图案和文字的享元工厂,相同的图案和文字对象被共享,而每个披萨对象只需要保存一个对共享对象的引用。这样,不同的披萨对象可以共享相同的图案和文字,减少了内存占用和提高了效率。