设计模式之享元模式(十五)

享元模式是一种结构型设计模式,通过共享不变的内部状态来减少内存消耗。例如,在一个游戏中,通过享元工厂类可以共享墙壁对象,减少创建大量相同对象的需求,从而提高系统性能。墙壁的颜色是内部状态,坐标是外部状态,即使坐标不同,相同颜色的墙壁也会被同一个对象表示。
摘要由CSDN通过智能技术生成

享元模式(Flyweight Pattern)是一种结构型设计模式,它通过共享相同的对象来减少内存使用和创建对象的数量。在此模式中,对象的状态被分为内部状态和外部状态。内部状态是不变的,可以被共享,而外部状态是可变的,每个对象都需要独立维护。通过共享内部状态,我们可以减少对象的数量,拓展系统的使用性能和可扩展性。

举个例子,假设我们需要创建一个游戏场景类,在场景中有许多相同的墙壁。如果我们使用常规的创建墙壁对象的方式,每个墙壁将需要分配一块内存,这可能会导致内存占用过高和性能下降。使用享元模式,我们可以创建一个享元工厂类,它会维护已经创建的墙壁对象,并在需要时返回已创建的对象。这样可以减少内存占用并提高性能。

下面是Java代码实现:

首先,需要定义场景中的墙壁类 Wall,它包含了墙壁的内部状态信息。这里我们只定义了一条记录墙壁的颜色:

public class Wall {
    private String color;
    
    public Wall(String color) {
        this.color = color;
    }
    
    public String getColor() {
        return color;
    }
}

接下来,需要定义一个享元工厂类 WallFactory,它维护了场景中的墙壁对象。在创建墙壁对象时,如果已经存在相同颜色的墙壁,它会返回已创建的对象。这里使用HashMap来保存已创建的对象,使用颜色作为键。

import java.util.HashMap;
import java.util.Map;

public class WallFactory {
    private static final Map<String, Wall> walls = new HashMap<>();
    
    public static Wall getWall(String color) {
        Wall wall = walls.get(color);
        
        if (wall == null) {
            wall = new Wall(color);
            walls.put(color, wall);
        }
        
        return wall;
    }
}

最后,我们在场景类 Scene 中使用 WallFactory 来创建墙壁对象。每个墙壁都有不同的坐标,这是它的外部状态。通过共享已创建的墙壁对象,我们可以减少对象的数量。

public class Scene {
    public static void main(String[] args) {
        // 创建场景中的墙壁
        Wall redWall = WallFactory.getWall("red");
        Wall yellowWall = WallFactory.getWall("yellow");
        Wall redWall2 = WallFactory.getWall("red");
        
        // 输出墙壁的颜色和坐标
        System.out.println(redWall.getColor() + " wall at (1, 1)");
        System.out.println(yellowWall.getColor() + " wall at (2, 2)");
        System.out.println(redWall2.getColor() + " wall at (3, 3)");
    }
}

输出结果如下:

red wall at (1, 1)
yellow wall at (2, 2)
red wall at (3, 3)

在这个例子中,我们可以看到红色墙壁对象被共享了两次,虽然它们的坐标不同,但是它们实际上是同一个对象。这种共享机制可以大大减少系统的内存占用。此外,如果需要进行大量墙壁的创建和销毁操作,使用享元模式可以提高系统的性能和可扩展性。

希望这个例子能够帮助你理解享元模式。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值