Java学设计模式之享元模式

一、享元模式概念

1.1 什么是享元模式

享元模式是一种结构型设计模式,旨在通过共享对象来最大程度地减少内存使用和提高性能。在享元模式中,对象被设计成可共享的,以便在需要时能够被多个不同的上下文使用。

结构

享元模式通常包含以下几个要素:

  1. Flyweight(享元): 定义了共享对象的接口,包含了需要被共享的状态。通过这些接口,享元对象可以接受并作用于外部状态。

  2. ConcreteFlyweight(具体享元): 实现了享元接口,表示可被共享的具体对象。具体享元对象中包含了内部状态,而外部状态则由客户端在使用时传递给享元对象。

  3. UnsharedConcreteFlyweight(非共享具体享元): 不可被共享的具体对象,通常是一些不可复用的对象,其中包含了不适合被共享的状态。

  4. FlyweightFactory(享元工厂): 负责创建和管理享元对象。当客户端请求一个享元对象时,享元工厂负责检查是否已经有相应的享元对象存在,如果存在则返回已有的对象,如果不存在则创建一个新的享元对象并将其加入到享元池中。

  5. Client(客户端): 使用享元模式的客户端。客户端通常会维护一些外部状态,并在需要时将这些状态传递给享元对象。

二、享元模式代码

2.1 享元

public interface ChessPiece {
    void display(String position);
}

2.2 具体享元

public class ConcreteChessPiece implements ChessPiece {

    private String color;

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

    @Override
    public void display(String position) {
        System.out.println("Chess piece color: " + color + ", position: " + position);
    }

}

2.3 享元工厂

public class ChessPieceFactory {

    private Map<String, ChessPiece> pieces = new HashMap<>();

    public ChessPiece getChessPiece(String color) {
        if (!pieces.containsKey(color)) {
            pieces.put(color, new ConcreteChessPiece(color));
        }
        return pieces.get(color);
    }

}

2.4 测试类

public class FlyweightPatternTest {
    public static void main(String[] args) {
        ChessPieceFactory factory = new ChessPieceFactory();
        ChessPiece whitePawn1 = factory.getChessPiece("white");
        whitePawn1.display("a2");

        ChessPiece whitePawn2 = factory.getChessPiece("white");
        whitePawn2.display("b2");

        ChessPiece blackPawn = factory.getChessPiece("black");
        blackPawn.display("a7");
    }
}

三、总结

享元模式的优点包括:

  • 大大减少了对象的数量,节省了内存空间。
  • 提高了系统的性能,因为共享对象可以被多个客户端同时使用。

缺点包括:

  • 需要对外部状态进行管理,可能会增加系统的复杂性。
  • 共享对象的状态改变可能会影响到其他使用该对象的客户端。
posted @ 2024-05-10 09:13  Kllin  阅读(7)  评论(0编辑  收藏  举报