设计模式总结篇系列:享元模式(Flyweight)

简介:

我们都知道,Java中的String类具有如下特性:String是一个不可变类,当直通过用字符串方式使用String对象时,Jvm实际上在内存中只存有一份,且存在字符串常量池中。当对字符串直接进行修改时(如直接联接另一个字符串常量),Jvm会首先去字符串常量池中查找是否已经存在此字符串,不存在则创建一份放在池中,存在则直接使用。诸如此类:当系统中可能具有多个相同的对象时,对于具有相同的内容的对象可以实现对象的共享,即共享池,以此避免不必要的相同对象的创建以减少系统内存的开销。称之为享元模式。

对于定义中的相同的对象,相同一词如何理解?首先我们需要解释下享元模式中的两个概念:内蕴状态和外蕴状态。

内蕴状态:享元对象内部的可以以此来作为区分是否是同一个对象的依据的属性。内蕴状态不随着外部环境的变化而变化。

外蕴模式:虽然也是享元对象的属性,但可以随着外部环境的变换而变化,同一享元对象在不同的地方其内部的外蕴状态可能不同。

享元模式一般的累定义过程如下:

1. 定义享元类的接口:

复制代码
1 interface Flyweight{
2     
3     // 用于改变外蕴状态 
4     public void changeStat(String exState);
5     
6 }
复制代码

2.定义发具体的享元类:

复制代码
 1 class ConcreteFlyweight implements Flyweight {
 2 
 3     //内蕴状态
 4     private String innerState;
 5 
 6     // 外蕴状态 
 7     private String exState;
 8 
 9     public ConcreteFlyweight(String innerState) {
10         this.innerState = innerState;
11     }
12 
13     @Override
14     public void changeStat(String exState) {
15         this.exState = exState;
16     }
17 
18 }
复制代码

3. 定义工厂类,用来管理享元对象:

复制代码
 1 class FlyweightFactory {
 2     private static Map<String, Flyweight> flyweightMap = new HashMap<String, Flyweight>();
 3 
 4     public static Flyweight getFlyweight(String innerState) {
 5         Flyweight flyweight = flyweightMap.get(innerState);
 6         if (flyweight == null) {
 7             flyweight = new ConcreteFlyweight(innerState);
 8             flyweightMap.put(innerState, flyweight);
 9         }
10         return flyweight;
11     }
12 
13 }
复制代码

4. 客户端测试:

复制代码
 1 public class FlyweightTest {
 2 
 3     public static void main(String[] args) {
 4         Flyweight a = FlyweightFactory.getFlyweight("A");
 5         a.changeStat("first-A");
 6         Flyweight b = FlyweightFactory.getFlyweight("B");
 7         b.changeStat("first-B");
 8         Flyweight aa = FlyweightFactory.getFlyweight("A");
 9         
10         a.changeStat("second-A");
11         Flyweight bb = FlyweightFactory.getFlyweight("B");
12         b.changeStat("second-B");
13         
14         System.out.println(a == aa);  // true
15         System.out.println(b == bb);  // true
16     }
17 }
复制代码

 通过最近的7篇文章大体上对Java设计模式中的七中结构型模式进行了总结,分别是:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式和享元模式。

 

---------------------------------------------------------------------------------
笔者水平有限,若有错漏,欢迎指正,如果转载以及CV操作,请务必注明出处,谢谢!
分类: 设计模式

本文转自Windstep博客园博客,原文链接:http://www.cnblogs.com/lwbqqyumidi/p/3764191.html,如需转载请自行联系原作者
目录
相关文章
|
1月前
|
设计模式 存储 Java
23种设计模式,享元模式的概念优缺点以及JAVA代码举例
【4月更文挑战第6天】享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享技术有效地支持大量细粒度对象的重用。这个模式在处理大量对象时非常有用,特别是当这些对象中的许多实例实际上可以共享相同的状态时,从而可以减少内存占用,提高程序效率
54 4
|
1月前
|
设计模式 Go
[设计模式 Go实现] 结构型~享元模式
[设计模式 Go实现] 结构型~享元模式
|
1月前
|
设计模式 Java 开发者
【搞懂设计模式】享元模式:共享节约,皆大欢喜!
【搞懂设计模式】享元模式:共享节约,皆大欢喜!
31 0
|
1月前
|
设计模式 存储 Java
小谈设计模式(27)—享元模式
小谈设计模式(27)—享元模式
|
1月前
|
设计模式 存储 Java
[设计模式Java实现附plantuml源码~结构型]实现对象的复用——享元模式
[设计模式Java实现附plantuml源码~结构型]实现对象的复用——享元模式
|
1月前
|
设计模式 存储 安全
【设计模式系列笔记】享元模式
享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享对象来最小化内存使用或计算开销,以提高性能。该模式适用于需要大量相似对象的场景,通过共享这些相似对象的部分状态,可以有效减少内存消耗。
44 0
|
1月前
|
设计模式 缓存 Java
设计模式之享元模式
设计模式之享元模式
|
1月前
|
设计模式 存储 缓存
聊聊Java设计模式-享元模式
享元(Flyweight)模式:顾名思义就是**被共享的单元**。意图是复用对象,节省内存,提升系统的访问效率。比如在红白机冒险岛游戏中的背景花、草、树木等对象,实际上是可以多次被不同场景所复用共享,也是为什么以前的游戏占用那么小的内存,却让我们感觉地图很大的原因。
23 3
聊聊Java设计模式-享元模式
|
1月前
|
设计模式 存储 缓存
【设计模式】享元模式
【设计模式】享元模式
|
1月前
|
设计模式 存储 Go
Golang设计模式——16享元模式
Golang设计模式——16享元模式
30 0