Java中的享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享尽可能多的对象来减少内存占用和提高性能.
Java享元模式通常包含以下4种角色
注意:抽象享元和非共享状态角色是可选的,可以省略它们将其功能合并到其他角色中
当客户端请求创建或访问一个享元对象时,享元工厂会检查是否已经创建了该对象.如果已经创建,则返回现有对象的引用;如果尚未创建,则创建新的对象并返回其引用.这样客户端可以共享现有对象,而不必创建新的对象,从而减少内存占用和提高性能.
以电商中的商品信息为例,在电商中,每个商品都有一个名称,价格,库存等属性.通常情况下,每个商品都需要单独创建一个对象,这样会导致内存占用增加,而且如果多次购买相同的商品,系统会创建多个相同的对象,浪费资源.
抽象享元
public interface Product {
String getName();
double getPrice();
int getStock();
}
具体享元
public class ConcreteProduct implements Product{
private String name;
private double price;
private int stock;
public ConcreteProduct(String name, double price, int stock) {
this.name = name;
this.price = price;
this.stock = stock;
}
@Override
public String getName() {
return name;
}
@Override
public double getPrice() {
return price;
}
@Override
public int getStock() {
return stock;
}
}
享元工厂
public class ProductFactory {
private static Map<String, Product> productMap = new HashMap<>();
public static Product getProduct(String name, double price, int stock) {
String key = name + "_" + price;
Product res = productMap.get(key);
if (Objects.isNull(res)) {
// 如果缓存池内不存在,就创建新对象放置到缓存池
res = new ConcreteProduct(name, price, stock);
productMap.put(key, res);
}
return res;
}
}
测试
public class Demo {
public static void main(String[] args) {
Product p1 = ProductFactory.getProduct("iPhone 14 Plus", 8899, 1);
Product p2 = ProductFactory.getProduct("iPhone 14 Plus", 8899, 1);
System.out.println(p1 == p2);
}
}
在上面示例代码中,首先创建一个商品接口Product,其中包含了商品的名称,价格,库存等属性.然后创建具体的商品类ConcreteProduct,实现Product接口,并定义共享的内部状态name,price,和stock.接下来我们创建商品工厂ProductFactory,用于创建和管理共享的商品对象,在这个工厂中,我们使用HashMap来储存共享的商品对象,每当客户端需要购买一个商品时,我们先检查是否已经创建了该商品对象,如果已经创建,则返回现有对象的引用,如果未创建,则创建新的对象储存到HashMap并返回其引用.
优点
缺点
应用场景