2023年10月21日 1 分钟阅读

享元模式(Flyweight Pattern)

tinyash 0 条评论
blog16

享元模式是一种结构型设计模式,用于减少对象的内存占用和提高性能。它通过共享相似对象的公共部分,来减少对象的重复创建,从而降低内存消耗。

结构

  • 享元接口(Flyweight): 定义了共享对象的接口,通常包括一些方法,用于获取和操作内部状态。
public interface Flyweight {
    void operation();
}
  • 具体享元类(Concrete Flyweight): 实现了享元接口,包含内部状态,并对其进行管理。
public class ConcreteFlyweight implements Flyweight {
    private String intrinsicState;

    public ConcreteFlyweight(String intrinsicState) {
        this.intrinsicState = intrinsicState;
    }

    public void operation() {
        System.out.println("Concrete Flyweight: " + intrinsicState);
    }
}
  • 享元工厂(Flyweight Factory): 管理享元对象的创建和共享,维护一个享元对象池,以确保对象的共享性。
public class FlyweightFactory {
    private Map<String, Flyweight> flyweights = new HashMap<>();

    public Flyweight getFlyweight(String key) {
        if (flyweights.containsKey(key)) {
            return flyweights.get(key);
        } else {
            Flyweight flyweight = new ConcreteFlyweight(key);
            flyweights.put(key, flyweight);
            return flyweight;
        }
    }
}

优点和缺点

优点:

  1. 减少内存消耗: 享元模式通过共享相似对象的公共部分,减少了对象的内存占用,特别适用于大量相似对象的情况。
  2. 提高性能: 由于减少了对象的创建和销毁,享元模式可以提高系统的性能。
  3. 灵活性: 享元模式允许对象的内部状态和外部状态分离,使得对象更容易共享和复用。

缺点:

  1. 增加复杂性: 引入享元模式可能增加系统的复杂性,需要维护享元工厂来管理共享对象。
  2. 不适用于所有情况: 享元模式适用于有大量相似对象的情况,对于不共享内部状态的对象不适用。

示例

以下是一个享元模式的示例,表示不同颜色的方块共享相同的形状。在这个示例中,Shape 表示形状的接口,ConcreteShape 表示具体的形状,ShapeFactory 是享元工厂,负责管理共享的形状对象。

// 享元接口
public interface Shape {
    void draw(int x, int y);
}

// 具体享元类
public class ConcreteShape implements Shape {
    private String color;

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

    public void draw(int x, int y) {
        System.out.println("Draw a " + color + " square at (" + x + ", " + y + ")");
    }
}

// 享元工厂
import java.util.HashMap;
import java.util.Map;

public class ShapeFactory {
    private Map<String, Shape> shapes = new HashMap<>();

    public Shape getShape(String color) {
        if (shapes.containsKey(color)) {
            return shapes.get(color);
        } else {
            Shape shape = new ConcreteShape(color);
            shapes.put(color, shape);
            return shape;
        }
    }
}

// 客户端代码
public class Main {
    public static void main(String[] args) {
        ShapeFactory factory = new ShapeFactory();

        Shape redSquare = factory.getShape("red");
        redSquare.draw(10, 10);

        Shape blueSquare = factory.getShape("blue");
        blueSquare.draw(20, 20);

        Shape greenSquare = factory.getShape("green");
        greenSquare.draw(30, 30);
    }
}

在这个例子中,ShapeFactory 确保了相同颜色的方块共享相同的形状对象,从而减少了内存占用。客户端可以根据需要获取不同颜色的方块,并在不同位置绘制它们。享元模式有效减少了形状对象的创建。

精选推荐 RECOMMEND
阿里云
前往领券

☁️ 阿里云新客专享

🎁 新用户 8 折优惠,云服务器、建站套餐都能省一笔

新用户专享,个人建站从这里开始

腾讯云
点击查看

🚀 腾讯云活动专区

💻 4核4G服务器新客 38元/年起,香港地域低至 6.5 折/月

活动价格以官网为准

🙋 AI焕新季,马上用千问

🧩 AI 大模型入门套餐首购低至 4.5 折

领1728元礼包

阿里云
领养龙虾

🦞 OpenClaw

⚡ 分钟级部署 OpenClaw,低至 68 元 1 年,专属你的 AI 管家

自动帮你干活,适合个人和团队

发表评论

你的邮箱地址不会被公开,带 * 的为必填项。

工具站推荐 TINYASH TOOL HUB

效率工具,一站直达

常用工具都在这里,打开即用 www.tinyash.com/tool

Markdown 图片处理 开发调试 效率工具