结构型模式之享元模式

GitHub地址:https://github.com/zhangboqing/design-mode/tree/master/src/main/java/com/zbq

一.定义

  享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻量级模式,它是一种对象结构型模式。

二、模式结构成员构成

? Flyweight: 抽象享元类

? ConcreteFlyweight: 具体享元类

? UnsharedConcreteFlyweight: 非共享具体享元类

? FlyweightFactory: 享元工厂类

三.代码示例

 1 /**
 2  * Flyweight
 3  * 抽象享元类
 4  */
 5 public interface Flyweight {
 6     //一个示意性方法,参数state是外蕴状态
 7     public void operation(String state);
 8 }
 9
10 /**
11  * ConcreteFlyweight
12  * 具体享元类
13  */
14 public class ConcreteFlyweight implements Flyweight {
15     //代表内部状态
16     private Character intrinsicState = null;
17     /**
18      * 构造函数,内蕴状态作为参数传入
19      * @param state
20      */
21     public ConcreteFlyweight(Character state){
22         this.intrinsicState = state;
23     }
24
25
26     /**
27      * 外蕴状态作为参数传入方法中,改变方法的行为,
28      * 但是并不改变对象的内蕴状态。
29      */
30     @Override
31     public void operation(String state) {
32         // TODO Auto-generated method stub
33         System.out.println("Intrinsic State = " + this.intrinsicState);
34         System.out.println("Extrinsic State = " + state);
35     }
36
37 }
38
39 /**
40  * FlyweightFactory
41  * 享元工厂类
42  */
43 public class FlyweightFactory {
44     private Map<Character,Flyweight> files = new HashMap<Character,Flyweight>();
45
46     public Flyweight factory(Character state){
47         //先从缓存中查找对象
48         Flyweight fly = files.get(state);
49         if(fly == null){
50             //如果对象不存在则创建一个新的Flyweight对象
51             fly = new ConcreteFlyweight(state);
52             //把这个新的Flyweight对象添加到缓存中
53             files.put(state, fly);
54         }
55         return fly;
56     }
57 }
58
59 /**
60  * client
61  */
62 public class Client {
63
64     public static void main(String[] args) {
65         // TODO Auto-generated method stub
66         FlyweightFactory factory = new FlyweightFactory();
67         Flyweight fly = factory.factory(new Character(‘a‘));
68         fly.operation("First Call");
69
70         fly = factory.factory(new Character(‘b‘));
71         fly.operation("Second Call");
72
73         fly = factory.factory(new Character(‘a‘));
74         fly.operation("Third Call");
75     }
76
77 }

四.优点和缺点分析

优点:

>享元模式的优点在于它可以极大减少内存中对象的数量,使得相同对象或相似对象在内存中只保存一份

>享元模式的外部状态相对独立,而且不会影响其内部状态,从而使得享元对象可以在不同的环境中被共享

缺点:

>享元模式使得系统更加复杂,需要分离出内部状态和外部状态,这使得程序的逻辑复杂化

>为了使对象可以共享,享元模式需要将享元对象的状态外部化,而读取外部状态使得运行时间变长

五.应用场景

>当系统有大量相同或者相似的对象,由于这类对象的大量使用,造成内存的大量耗费

>对象的大部分状态都可以外部化,可以将这些外部状态传入对象中

>使用享元模式需要维护一个存储享元对象的享元池,而这需要耗费资源,因此,应当在多次重复使用享元对象时才值得使用享元模式

原文地址:https://www.cnblogs.com/756623607-zhang/p/9227072.html

时间: 2024-10-10 16:38:02

结构型模式之享元模式的相关文章

结构型设计模式之享元模式

结构 意图 运用共享技术有效地支持大量细粒度的对象. 适用性 一个应用程序使用了大量的对象. 完全由于使用大量的对象,造成很大的存储开销. 对象的大多数状态都可变为外部状态. 如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象. 应用程序不依赖于对象标识.由于F l y w e i g h t 对象可以被共享,对于概念上明显有别的对象,标识测试将返回真值. 1 using System; 2 using System.Collections; 3 4 class Flyweigh

java-设计模式(结构型)-【享元模式】

1.享元模式(Flyweight) 定义:享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用.   1.1 工厂 //工厂:内置一个池,如果存在了则取出,否则则创建加入池中 public class FactoryPool { private Hashtable<String,Person> pool=new Hashtable<String,Person>(); public Person getPerson(String

15结构型模式之享元模式

概念 Flyweight模式也叫享元模式,是构造型模式之一,它通过与其他类似对象共享数据来减小内存占用. 角色和职责 抽象享元角色: 所有具体享元类的父类,规定一些需要实现的公共接口. 具体享元角色: 抽象享元角色的具体实现类,并实现了抽象享元角色规定的方法. 享元工厂角色: 负责创建和管理享元角色. 使用场景: 是以共享的方式,高效的支持大量的细粒度的对象. 案例 //相同的信息,但不是同一个人. #include <iostream> using namespace std; #inclu

结构型模式之 享元模式

享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度对象的复用.系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用.由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻量级模式,它是一种对象结构型模式. 面向对象技术可以很好地解决一些灵活性或可扩展性问题,但在很多情况下需要在系统中增加类和对象的个数.当对象数量太多时,将导致运行代价过高,带来性能下降等问题. 享元模式正是为解决这一类问题而诞生的.享元模式通过共享技术实现相同或相似

装饰者模式、享元模式

一.装饰者模式 装饰模式与继承模式的目的都是扩展对象的功能,但是装饰模式比继承有更多的灵活性. 齐天大圣 c =new 大圣本尊():齐天大圣 fish = new 鱼儿(c):齐天大圣 bird = new 雀儿(fish); 二.享元模式 享元对象以共享的方式高效地支持大量的细粒度对象, 享元对象能做到共享的关键,是区分内部状态和外部状态,一个外部状态是随环境而改变的,不可共享,存储在客户端:内部状态是存储在享元对象的内部,不随环境而改变. -------------------------

用最简单的例子说明设计模式(三)之责任链、建造者、适配器、代理模式、享元模式

责任链模式 一个请求有多个对象来处理,这些对象是一条链,但具体由哪个对象来处理,根据条件判断来确定,如果不能处理会传递给该链中的下一个对象,直到有对象处理它为止 使用场景 1)有多个对象可以处理同一个请求,具体哪个对象处理该请求待运行时刻再确定 2)在不明确指定接收者的情况下,向多个对象中的一个提交一个请求 3)可动态指定一组对象处理请求,客户端可以动态创建职责链来处理请求 public class Chain { public abstract class Handler { private

设计模式---对象性能模式之享元模式(Flyweight)

一:概念 通过与其他类似对象共享数据来减少内存占用 如果一个应用程序使用了太多的对象, 就会造成很大的存储开销. 特别是对于大量轻量级 (细粒度)的对象,比如在文档编辑器的设计过程中,我们如果为每个字母创建一个对象的话,系统可能会因为大量的对象而造成存储开销的浪费.例如一个字母“a”在文档中出现了100000 次,而实际上我们可以让这一万个字母“a”共享一个对象,当然因为在不同的位置可能字母“a”有不同的显示效果(例如字体和大小等设置不同) ,在这种情况我们可以为将对象的状态分为“外部状态”和“

java设计模式5.组合模式、门面模式、享元模式、桥接模式

组合模式 在面向对象的语言中,树结构有着巨大的威力,一个基于继承的类型的等级结构便是一个数结构,一个基于合成的对象结构也是一个数结构.组合模式将部分与整体的关系用树结构表示出来,使得客户端把一个个单独的成分对象和由它们组合而成的合成对象同等看待. 抽象构建角色:一个抽象角色,给参加组合的对象规定一个接口,这个接口给出共有的接口及默认行为. 树叶构建角色:代表参加组合的树叶对象,没有子对象,定义参加组合的原始对象行为. 树枝构建角色:代表参加组合的有子对象的对象,并给出树枝构件对象的行为. 对于子

第13章 结构型模式—享元模式

1. 享元模式(Flyweight Pattern)的定义 (1)运用共享技术高效地支持大量细粒度的对象 ①对象内部状态:数据不变且重复出现,这部分不会随环境变化而改变,是可以共享的. ②对象外部状态:数据是变化的,会随环境变化而改变,是不可以共享的. ③所谓的享元,就是把内部状态的数据分离出来共享,通过共享享元对象,可以减少对内存的占用.把外部状态分离出来,放到外部,让应用程序在使用的时候进行维护,并在需要的时候传递给享元对象使用. ④享元模式真正缓存和共享的是享元的内部状态,而外部状态是不被