我是靠谱客的博主 重要白云,这篇文章主要介绍设计模式-结构型-享元模式(Flyweight)优点缺点应用场景类图,现在分享给大家,希望可以做个参考。

定义

使用共享对象可有效地支持大量的细粒度的对象

Use sharing to support large numbers of fine-grained objects efficiently

角色

抽象享元角色(Flyweight):产品的抽象类,同时定义出对象的外部状态和内部状态的接口或实现

具体享元角色(ConcreteFlyweight):具体产品类,实现抽象享元定义的业务;需要注意的是内部处理应该与环境无关,不应该出现一个操作改变了内部状态,同时修改了外部状态,这是不允许的

不可共享的享元角色(unsharedConcreteFlyweight):不存在外部状态或者安全要求(如线程安全)不能够使用共享技术的对象,该对象一般不会出现在享元工厂中

享元工厂(FlyweightFactory):构造一个池容器,同时提供从池中获得对象的方法

优点

  • 减少应用程序创建的对象
  • 降低程序内存的占用
  • 增强程序的性能

缺点

  • 提高了系统复杂性
  • 需要分离出外部状态和内部状态
  • 外部状态具有固化特性,不应该随内部状态改变而改变,否则导致系统的逻辑混乱

应用场景

  • 系统中存在大量的相似对象
  • 细粒度的对象都具备较接近的外部状态,而且内部状态与环境无关,也就是说对象没有特定身份
  • 需要缓冲池的场景

类图

flyweight

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.vapy.structure.flyweght; /** * * @author vapy 2016年11月9日 * */ public abstract class Flyweight { // 内部状态 private String intrinsic; // 外部状态 protected final String extrinsic; public Flyweight(String _extrinsic) { this.extrinsic = _extrinsic; } // 定义业务操作 public abstract void operate(); public String getIntrinsic() { return intrinsic; } public void setIntrinsic(String intrinsic) { this.intrinsic = intrinsic; } }
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.vapy.structure.flyweght; /** * * @author vapy 2016年11月9日 * */ public class ConcreteFlyweight extends Flyweight { public ConcreteFlyweight(String _extrinsic) { super(_extrinsic); } @Override public void operate() { // 业务逻辑 } }
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.vapy.structure.flyweght; import java.util.HashMap; /** * * @author vapy 2016年11月9日 * */ public class FlyweightFactory { // 定义一个容器 private static HashMap<String, Flyweight> pool = new HashMap<String, Flyweight>(); // 享元工厂 public static Flyweight getFlyweight(String extrinsic) { Flyweight flyweight = null; if (pool.containsKey(extrinsic)) { flyweight = pool.get(extrinsic); } else { flyweight = new ConcreteFlyweight(extrinsic); pool.put(extrinsic, flyweight); } return flyweight; } }

另外,JDK中也大量使用到了享元模式,举个例子:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.vapy.structure.Flyweght; /** * * @author vapy 2016年11月9日 * */ public class FlyweightTest { public static void main(String[] args) { String str1 = "a"; String str2 = "b"; String str3 = "ab"; String str4; str4 = str1 + str2; System.out.println(str3 == str4); str4 = (str1 + str2).intern(); System.out.println(str3 == str4); Integer int1 = 100; Integer int2 = 100; Integer int3 = 1000; Integer int4 = 1000; System.out.println(int1 == int2); System.out.println(int3 == int4); } }

flyweight_test
本文代码可在github查看:点击此处

最后

以上就是重要白云最近收集整理的关于设计模式-结构型-享元模式(Flyweight)优点缺点应用场景类图的全部内容,更多相关设计模式-结构型-享元模式(Flyweight)优点缺点应用场景类图内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(81)

评论列表共有 0 条评论

立即
投稿
返回
顶部