6. 享元模式(Flyweight Pattern)
享元模式也并不复杂,它的作用主要是为了节省开销而设计的,它避免了产生拥有相同内容的大量的"小类",改为大家都共用同一个类。
享元模式将系统中的对象的装态分为内蕴状态(intrinsic)和外蕴状态(extrinsic)两种,内蕴状态是可以不会随着运行环境的变化而变化的,而外蕴状态则相反,所以,内蕴状态可以用来共享,而外蕴状态只能由客户端来保存,可以在必要时传给享元进行某些操作。
享元模式的结构主要包括下面的几个部分:
首先,是享元的接口,
public interface Flyweight {
public void operate(ExternalState externalState);
}
然后是Flyweight的具体实现类,
public class ConcreteFlyweight implements Flyweight {
private InternalState internalState;
@Override
public void operate(ExternalState externalState) {
System.out.println("operating is performed");
}
}
这个类内部就包括了一个可以共享的"内部状态"了。
这个就是可以用来共享的享元了。但是,还会有不用于共享的,也有一些本身不能共享但是内部状态是由一系列享元构成的"符合享元"。
public class UnsharedConcreteFlyweight implements Flyweight {
private ExternalState externalState;
private Flyweight flyweightState1;
private Flyweight flyweightState2;
@Override
public void operate(ExternalState externalState) {
System.out.println("operating is performed");
}
}
最后是一个Flyweight的Factory,实现了一个Flyweight池的功能,
public class FlyweightFactory {
// Flyweight pool
private Map<Object, Flyweight> flyweights = new HashMap<Object, Flyweight>();
public Flyweight getFlyweight(Object key) {
Flyweight flyweight = flyweights.get(key);
if (flyweight == null) {
// 产生新的ConcreteFlyweight
flyweight = new ConcreteFlyweight();
flyweights.put(key, flyweight);
}
return flyweight;
}
}
最后,客户端就可以重复的使用享元了,
public class Client {
public static void main(String[] args) {
FlyweightFactory factory = new FlyweightFactory();
for (int i = 0; i < 10000; i++) {
Flyweight flyweight = factory.getFlyweight("key");
flyweight.operate();
}
}
}
这样,相同的"key"就可以共享同一个对象了。
使用享元模式时,要注意内蕴状态和外蕴状态的划分,外蕴状态一定不能用来共享。另外只有在使用大量对象并因此造成了性能开销的情况下才有必要使用享元模式。
最后,给出享元模式的类图:

- 大小: 26.8 KB
分享到:
相关推荐
JAVA-设计模式-结构型模式-享元模式
c++设计模式-结构型模式-享元模式;qt工程;c++简单源码; 享元(Flyweight)模式的定义:运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似类...
享元模式是软件设计模式中的一种结构型模式,它的主要目的是为了提高性能,尤其是在大量对象创建时。享元模式通过共享已有对象来减少内存中对象的数量,从而达到降低内存消耗的效果。这种模式适用于那些轻量级对象,...
享元模式是软件设计模式中的一种结构型模式,它的主要目的是通过共享大量细粒度对象来减少内存的使用,提高系统性能。在许多场景下,尤其是处理大量相似对象时,享元模式能显著减少内存开销。这个压缩包文件...
享元模式是一种结构型设计模式,它通过共享已有对象来减少内存中对象的数量,从而达到提高系统性能的目的。在大型软件系统中,特别是在处理大量相似对象时,享元模式能够有效地减少内存开销,提高系统运行效率。在这...
享元模式是一种结构型设计模式,它通过共享已有对象来减少内存中对象的数量,从而达到降低系统内存占用、提高性能的目的。在软件工程中,当系统中存在大量相似或重复的对象时,享元模式尤为适用。 享元模式的核心是...
在软件开发领域,设计模式和体系结构是两个至关重要的概念,尤其在大型项目中,它们对于软件的可维护性、可扩展性和可复用性起着决定性的作用。本项目——“服装管理系统”是一个很好的实践案例,让我们深入探讨其中...
设计模式09-外观模式、享元模式 设计模式10-代理模式、结构型模式大复习 设计模式11-行为模式-责任链、命令模式 设计模式12-解释器模式 设计模式13-迭代器模式 设计模式14-中介者模式、备忘录模式 设计模式15-观察者...
设计模式-享元模式 设计模式是软件设计中的一种解决方案,旨在提高代码的可维护性、灵活性和可重用性。享元模式(Flyweight Pattern)是结构型模式的一种,主要用于减少大量相似对象的内存占用,提高系统的性能和...
- **享元**(Flyweight):运用共享技术有效地支持大量细粒度的对象。 - **代理**(Proxy):为其他对象提供一种代理以控制对这个对象的访问。 3. **行为型模式**: - **责任链**(Chain of Responsibility):避免...
桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立进行变化。这种模式在软件工程中被广泛应用于处理组件之间的耦合问题,特别是当需要为同一抽象提供多种实现或者需要独立地改变它们时。 ...
"设计模式之美——教你写出高质量代码"这个主题旨在帮助开发者更好地理解和应用设计模式,从而提升代码的质量和可维护性。设计模式不仅对面试有所帮助,也是职场发展中的必备技能,无论你使用哪种开发语言。 设计...
在软件开发领域,设计模式和体系结构是至关重要的概念,它们是解决常见问题的模板,为软件的可扩展性、可维护性和可重用性提供了基础。本资源"软件设计模式与体系结构课后习题代码(孙玉山).zip"包含了孙玉山教授讲解...
- 享元模式(Flyweight):使用共享对象,有效地支持大量细粒度的对象。 3. **行为型模式**:这类模式关注对象之间的责任分配。 - 责任链模式(Chain of Responsibility):避免将请求的发送者和接收者耦合在一起...
本实验报告主要探讨了五个关键的设计模式:组合模式、外观模式、代理模式、观察者模式以及策略模式,这些都是软件体系结构中的重要组成部分,对于理解和优化代码结构具有深远影响。 1. **组合模式**: 组合模式是一...
第一篇分为8章,介绍了软件体系结构的基础理论,包括软件体系结构的概念及演化、软件建模基础、软件体系结构的形式化、软件体系结构的风格、体系结构的描述语言、软件质量建模、设计模式等内容。第二篇分为4章,首先...
在IT行业中,软件体系结构设计模式是开发高质量、可维护和可扩展的软件系统的关键要素。设计模式是一种在特定上下文中解决常见问题的最佳实践,它为软件设计提供了可重用的解决方案。本作业将深入探讨软件体系结构...
享元模式(Flyweight Pattern)是一种结构型设计模式,用于减少创建大量小对象所带来的内存开销。通过共享对象,享元模式能够有效地支持大量细粒度的对象,减少内存使用并提高性能。它常用于需要大量重复对象的场景...
今天我们要探讨的是“Java设计模式之结构型模式”。结构型模式主要关注如何组织类和对象,以达到良好的架构,提升代码的可读性和可维护性。在这个主题中,我们将深入理解并讨论这些模式的原理、应用场景及其实现。 ...