Java设计模式之-享元模式
什么是享元模式?
享元模式是一种设计模式,用于减少对象的内存占用和提高性能。它通过共享相似对象的内部状态来减少重复对象的创建。
主要解决什么问题?
享元模式主要解决两个问题:
大量相似对象的内存占用:当系统中存在大量相似的对象时,每个对象都会占用一定的内存空间,导致内存消耗过大。
对象的创建和销毁开销:频繁创建和销毁对象会带来一定的开销,影响系统性能。
在什么时候我们需要使用享元模式?
当满足以下条件时,可以考虑使用享元模式:
系统中存在大量相似的对象,且这些对象的区别可以拆分为内部状态和外部状态。
对象的创建和销毁频率较高,需要减少对象的内存占用和创建销毁开销。
用一个生活中的应用实例来举例、类比
假设你正在开发一个电子商务网站,你需要展示大量的产品信息。每个产品都有一些共同的属性,比如名称、价格和库存数量,以及一些不同的属性,比如颜色和尺寸。这里,产品可以被看作是享元对象。
使用享元模式,你可以将共同属性作为内部状态,而将不同的属性作为外部状态。当展示产品时,可以共享相同内部状态的产品对象,并根据不同的外部状态设置其属性值。通过共享对象,可以减少内存占用,避免创建大量相似的产品对象。
优点
享元模式的优点包括:
减少内存占用:通过共享相似对象的内部状态,减少内存占用。
提高性能:共享对象的复用减少了对象的创建和销毁开销,提高了系统性能。
缺点
享元模式的缺点包括:
引入共享对象管理:引入共享对象需要额外的管理机制,增加了系统的复杂性。
对象状态共享:共享对象的内部状态需要是可共享的,如果对象有可变状态,则需要进行额外的处理。
使用场景
享元模式适用于以下情况:
系统中存在大量相似的对象,且这些对象的区别可以拆分为内部状态和外部状态。
对象的创建和销毁频率较高,需要减少对象的内存占用和创建销毁开销。
下面是一个简单的Java代码示例:
import java.util.HashMap;
import java.util.Map;
// 享元接口
interface Product {
void display(String color);
}
// 具体享元类
class ConcreteProduct implements Product {
private String name;
public ConcreteProduct(String name) {
this.name = name;
}
public void display(String color) {
System.out.println("Displaying " + name + " in " + color);
}
}
// 享元工厂类
class ProductFactory {
private Map<String, Product> productMap;
public ProductFactory() {
productMap = new HashMap<>();
}
public Product getProduct(String name) {
Product product = productMap.get(name);
if (product == null) {
product = new ConcreteProduct(name);
productMap.put(name, product);
}
return product;
}
}
// 客户端
public class Client {
public static void main(String[] args) {
ProductFactory productFactory = new ProductFactory();
Product product1 = productFactory.getProduct("Product A");
product1.display("Red");
Product product2 =productFactory.getProduct("Product A");
product2.display("Blue");
Product product3 = productFactory.getProduct("Product B");
product3.display("Green");
}
}
在这个示例中,Product 接口定义了 display 方法,表示产品的展示。ConcreteProduct 是具体的享元类,实现了 Product 接口,并包含一个内部状态 name 。ProductFactory 是享元工厂类,负责创建和管理产品对象。在客户端代码中,通过工厂类获取产品对象,并调用 display 方法展示产品。
通过使用享元模式,当获取相同名称的产品时,只会创建一个对象并进行共享,从而减少了内存占用和对象的创建开销。