设计模式总结篇系列:享元模式(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,如需转载请自行联系原作者
目录
相关文章
|
3月前
|
设计模式 Java
Java设计模式-享元模式(12)
Java设计模式-享元模式(12)
|
4月前
|
设计模式 存储 Java
【十】设计模式~~~结构型模式~~~享元模式(Java)
文章详细介绍了享元模式(Flyweight Pattern),这是一种对象结构型模式,通过共享技术实现大量细粒度对象的重用,区分内部状态和外部状态来减少内存中对象的数量,提高系统性能。通过围棋棋子的设计案例,展示了享元模式的动机、定义、结构、优点、缺点以及适用场景,并探讨了单纯享元模式和复合享元模式以及与其他模式的联用。
【十】设计模式~~~结构型模式~~~享元模式(Java)
|
5月前
|
设计模式 存储 JavaScript
js设计模式【详解】—— 享元模式
js设计模式【详解】—— 享元模式
68 6
|
6月前
|
设计模式 缓存 Java
Java设计模式:享元模式实现高效对象共享与内存优化(十一)
Java设计模式:享元模式实现高效对象共享与内存优化(十一)
|
6月前
|
设计模式 存储 Java
Java设计模式之享元模式详解
Java设计模式之享元模式详解
|
6月前
|
设计模式
享元模式-大话设计模式
享元模式-大话设计模式
|
7月前
|
设计模式 Go
[设计模式 Go实现] 结构型~享元模式
[设计模式 Go实现] 结构型~享元模式
|
7月前
|
设计模式 Java 开发者
【搞懂设计模式】享元模式:共享节约,皆大欢喜!
【搞懂设计模式】享元模式:共享节约,皆大欢喜!
108 0
|
7月前
|
设计模式 存储 Java
[设计模式Java实现附plantuml源码~结构型]实现对象的复用——享元模式
[设计模式Java实现附plantuml源码~结构型]实现对象的复用——享元模式
|
7月前
|
设计模式 存储 安全
【设计模式系列笔记】享元模式
享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享对象来最小化内存使用或计算开销,以提高性能。该模式适用于需要大量相似对象的场景,通过共享这些相似对象的部分状态,可以有效减少内存消耗。
85 0

热门文章

最新文章

  • 1
    设计模式转型:从传统同步到Python协程异步编程的实践与思考
    61
  • 2
    C++一分钟之-设计模式:工厂模式与抽象工厂
    47
  • 3
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    55
  • 4
    C++一分钟之-C++中的设计模式:单例模式
    65
  • 5
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    43
  • 6
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    70
  • 7
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    62
  • 8
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    43
  • 9
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    52
  • 10
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    121