返回
享元模式:轻量级对象复用 利器
后端
2023-10-30 17:38:00
享元模式:轻量级对象复用 利器
前言
目前正在出一个设计模式专题系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~
本节给大家讲一下设计模式中的享元模式,并结合实际业务场景给大家讲解如何使用~
本专题的所有案例代码主要以Java语言编写, 其他语言的同学可以自行转换一下~
什么是享元模式?
享元模式(Flyweight Pattern)是一种设计模式,用于减少对象的数量,从而提高性能。享元模式创建一组共享的对象,这些对象可以由多个客户端同时使用。这可以显著降低内存使用量,并提高应用程序的性能。
享元模式的英文名称为“Flyweight”,意为“轻量级”。享元模式的对象通常非常小,并且不包含任何状态。因此,它们可以被多个客户端同时使用,而不会对应用程序的性能造成太大影响。
享元模式的典型应用场景是:当系统中存在大量相似对象时,就可以使用享元模式来减少对象的创建数量。例如:在一个文字处理软件中,如果存在大量相同的字符,就可以使用享元模式来减少字符对象的创建数量。
享元模式的结构
享元模式的结构图如下:
- 享元工厂(Flyweight Factory) :享元工厂负责创建和管理享元对象。
- 享元对象(Flyweight) :享元对象是共享的对象,可以被多个客户端同时使用。
- 非享元对象(Concrete Flyweight) :非享元对象是享元对象的具体实现。
- 客户端(Client) :客户端使用享元对象来完成任务。
享元模式的优点
享元模式具有以下优点:
- 减少内存使用量:享元模式可以减少对象的创建数量,从而降低内存使用量。
- 提高性能:享元模式可以提高应用程序的性能,因为共享对象可以被多个客户端同时使用,而不会对应用程序的性能造成太大影响。
- 简化代码:享元模式可以简化代码,因为可以减少对象的创建数量。
享元模式的缺点
享元模式也存在以下缺点:
- 可能会降低灵活性:享元模式的对象通常不包含任何状态,因此它们可能缺乏灵活性。
- 可能会增加复杂性:享元模式的实现可能会增加应用程序的复杂性。
享元模式的应用场景
享元模式可以应用于以下场景:
- 当系统中存在大量相似对象时,就可以使用享元模式来减少对象的创建数量。
- 当对象的状态不需要存储在对象本身时,就可以使用享元模式来减少内存使用量。
- 当对象需要频繁创建和销毁时,就可以使用享元模式来提高性能。
享元模式的示例
Java代码示例 :
// 享元工厂
public class FlyweightFactory {
private Map<String, Flyweight> flyweights = new HashMap<>();
public Flyweight getFlyweight(String key) {
Flyweight flyweight = flyweights.get(key);
if (flyweight == null) {
flyweight = new ConcreteFlyweight(key);
flyweights.put(key, flyweight);
}
return flyweight;
}
}
// 享元对象
interface Flyweight {
void operation(String extrinsicState);
}
// 非享元对象
class ConcreteFlyweight implements Flyweight {
private String intrinsicState;
public ConcreteFlyweight(String intrinsicState) {
this.intrinsicState = intrinsicState;
}
@Override
public void operation(String extrinsicState) {
System.out.println("Intrinsic State: " + intrinsicState);
System.out.println("Extrinsic State: " + extrinsicState);
}
}
// 客户端
public class Client {
public static void main(String[] args) {
FlyweightFactory flyweightFactory = new FlyweightFactory();
Flyweight flyweight1 = flyweightFactory.getFlyweight("A");
flyweight1.operation("Extrinsic State 1");
Flyweight flyweight2 = flyweightFactory.getFlyweight("B");
flyweight2.operation("Extrinsic State 2");
Flyweight flyweight3 = flyweightFactory.getFlyweight("A");
flyweight3.operation("Extrinsic State 3");
}
}
运行结果 :
Intrinsic State: A
Extrinsic State: Extrinsic State 1
Intrinsic State: B
Extrinsic State: Extrinsic State 2
Intrinsic State: A
Extrinsic State: Extrinsic State 3
从运行结果可以看出,享元模式可以减少对象的创建数量。在该示例中,尽管创建了三个Flyweight对象,但实际