java设计模式(十二)享元模式(Flyweight Pattern)

1、模式介绍:

        享元模式是一种结构型设计模式,旨在通过共享对象来有效支持大量细粒度的对象。它通过将对象的状态分为内部状态(可共享)和外部状态(不可共享)来减少内存消耗和提高性能。内部状态存储在享元对象内部,而外部状态则由客户端代码管理和传递。

2、应用场景:

        对象池:当程序中存在大量相似对象且不需要区分其具体身份时,可以使用享元模式。比如线程池、连接池等。
        文本编辑器:对于每一个字符或者格式化文本片段,如果存在大量相同的文本片段,可以共享相同的内部状态,减少内存消耗。
        游戏开发:在游戏中,大量的角色或者粒子对象可能具有相同的外观和行为,可以通过享元模式来节省资源。
        字符串常量池:Java中的字符串常量池就是享元模式的一个实际应用,相同的字符串常量在内存中只存储一份,多个字符串变量可以共享同一个常量。

3、优点:

        减少内存消耗:通过共享相同的对象实例,减少内存使用。
        提高性能:减少了创建对象的时间,特别是在对象频繁被创建和销毁的场景下。

4、缺点:

        可能引入额外的复杂性:需要对内部状态和外部状态进行区分和管理,可能增加系统的复杂度。
        需要合理划分内部状态和外部状态:不正确的划分可能导致系统的逻辑混乱。

5、代码实现:

/**
 * 享元接口
 *
 * @author FM_南风
 * @date 2024/6/27
 */
public interface FlyweightInterface {
    //绘画方法
    void draw();
}

/**
 * 享元实现类
 *
 * @author FM_南风
 * @date 2024/6/27
 */
@Data
public class FlyweightClass implements FlyweightInterface{
     private final String color; // 颜色
     private int x, y, radius; // 坐标半径

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

     @Override
     public void draw() {
      System.out.println("享元实现类: 绘画 [Color : " + color
              + ", x : " + x + ", y :" + y + ", radius :" + radius);
     }
}

/**
 * 享元工厂
 *
 * @author FM_南风
 * @date 2024/6/27
 */
public class FlyweightFactory {

    private static final Map<String, FlyweightInterface> flyweightMap = new HashMap<>();

    public static FlyweightInterface getCircle(String color) {
        FlyweightClass flyweightClass = (FlyweightClass) flyweightMap.get(color);

        if (flyweightClass == null) {
            flyweightClass = new FlyweightClass(color);
            flyweightMap.put(color, flyweightClass);
            System.out.println("开始创作: " + color);
        }
        return flyweightClass;
    }
}

/**
 * 应用
 *
 * @author FM_南风
 * @date 2024/6/27
 */
public class FlyweightClient {
 private static final String[] colors = {"红", "绿", "蓝"};

 public static void main(String[] args) {
  for (int i = 0; i < 20; ++i) {
   FlyweightClass circle = (FlyweightClass) FlyweightFactory.getCircle(getRandomColor());
   circle.setX(getRandomX());
   circle.setY(getRandomY());
   circle.setRadius(100);
   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);
 }
}

6、结果展示:

7、代码示例说明:

在这个示例中:FlyweightClass类作为具体享元类,颜色(内部状态)color 是享元的一部分,而 x、y、raidus则是外部状态。
FlyweightFactory 类作为享元工厂,负责管理和提供享元对象。享元对象在首次创建时存储在 flyweightMap 中,以便于后续共享使用。
FlyweightClient类作为客户端代码,演示如何使用享元模式来创建和绘制多个圆形对象,共享相同的颜色。
通过享元模式,可以看到多个具有相同颜色的圆形对象共享同一个 FlyweightClass 实例,从而减少了对象的创建和内存消耗。

  • 36
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值