一、享元模式概念
1.1 什么是享元模式
享元模式是一种结构型设计模式,旨在通过共享对象来最大程度地减少内存使用和提高性能。在享元模式中,对象被设计成可共享的,以便在需要时能够被多个不同的上下文使用。
结构
享元模式通常包含以下几个要素:
-
Flyweight(享元): 定义了共享对象的接口,包含了需要被共享的状态。通过这些接口,享元对象可以接受并作用于外部状态。
-
ConcreteFlyweight(具体享元): 实现了享元接口,表示可被共享的具体对象。具体享元对象中包含了内部状态,而外部状态则由客户端在使用时传递给享元对象。
-
UnsharedConcreteFlyweight(非共享具体享元): 不可被共享的具体对象,通常是一些不可复用的对象,其中包含了不适合被共享的状态。
-
FlyweightFactory(享元工厂): 负责创建和管理享元对象。当客户端请求一个享元对象时,享元工厂负责检查是否已经有相应的享元对象存在,如果存在则返回已有的对象,如果不存在则创建一个新的享元对象并将其加入到享元池中。
-
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");
}
}
三、总结
享元模式的优点包括:
- 大大减少了对象的数量,节省了内存空间。
- 提高了系统的性能,因为共享对象可以被多个客户端同时使用。
缺点包括:
- 需要对外部状态进行管理,可能会增加系统的复杂性。
- 共享对象的状态改变可能会影响到其他使用该对象的客户端。