享元模式
享元模式
-
模式定义:运用共享技术来有效支持大量细粒度的对象,减少内存的占用,提高系统性能。
-
适用场景:一个系统中,存在大量相似的对象,占用大量内存,且这些对象可以被同意地共享。
-
UML类图:
-
角色说明:
- Flyweight(抽象享元角色):所建规定享元对象的公共接口,包含用于接收外部状态的方法。
- ConcreteFlyweight(具体享元角色):实现Flyweight接口,为内部状态增加存储空间,负责具体享元对象的创建和存储。
- UnsharedConcreteFlyweight(非共享具体享元角色):为不可共享的享元对象提供存储空间,需要与具体享元角色区别开来。
- FlyweightFactory(享元工厂角色):负责创建和管理享元角色,确保享元可以被共享和重用。
-
代码实现:
/**
* 抽象享元角色
*/
public interface Flyweight {
void operation(UnsharedConcreteFlyweight state);
}
/**
* 具体享元角色
*/
public class ConcreteFlyweight implements Flyweight {
private String intrinsicState;
ConcreteFlyweight(String intrinsicState) {
this.intrinsicState = intrinsicState;
}
@Override
public void operation(UnsharedConcreteFlyweight state) {
System.out.println("Intrinsic State = " + this.intrinsicState);
System.out.println("Extrinsic State = " + state.getExtrinsicState());
}
}
/**
* 非共享具体享元角色
*/
public class UnsharedConcreteFlyweight implements Flyweight {
private String extrinsicState;
UnsharedConcreteFlyweight(String extrinsicState) {
this.extrinsicState = extrinsicState;
}
public String getExtrinsicState() {
return this.extrinsicState;
}
@Override
public void operation(UnsharedConcreteFlyweight state) {
System.out.println("UnsharedConcreteFlyweight Operation! Extrinsic State = " + this.extrinsicState);
}
}
/**
* 享元工厂角色
*/
public class FlyweightFactory {
private Map<String, Flyweight> flyweightMap = new HashMap<>();
public Flyweight getFlyweight(String key) {
if (flyweightMap.containsKey(key)) {
return flyweightMap.get(key);
} else {
Flyweight flyweight;
if ("shared".equals(key)) {
flyweight = new ConcreteFlyweight("Shared ConcreteFlyweight!");
} else {
flyweight = new UnsharedConcreteFlyweight("Unshared ConcreteFlyweight!");
}
flyweightMap.put(key, flyweight);
return flyweight;
}
}
}
/**
* 使用享元模式
*/
public class Client {
public static void main(String[] args) {
FlyweightFactory factory = new FlyweightFactory();
Flyweight shared = factory.getFlyweight("shared");
Flyweight unshared = factory.getFlyweight("unshared");
shared.operation(new UnsharedConcreteFlyweight("SharedFlyweight System!"));
unshared.operation(new UnsharedConcreteFlyweight("UnsharedFlyweight System!"));
}
}
- 优缺点:
- 优点:
- 减少对象的创建,降低系统内存占用,提高系统性能。
- 可以复用已存在的对象,节省系统资源。
- 通过分离内部状态和外部状态,提高系统的灵活性。
- 缺点:
- 享元模式提高逻辑复杂度,需要维护共享对象的状态。
- 对象共享,对线程安全性提出一定的要求,需要加锁等措施。
- 优点:
以上就是对享元模式的详细介绍,包括定义、适用场景、UML类图、代码实现、优缺点等。要在实际开发中,结合具体场景,合理应用该模式,提高软件开发效率和代码质量。