- 浏览: 172872 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
lgh1992314:
String.intern()在全局常量池1.8在native ...
Java 内存模型 -
lgh1992314:
try with resource
Java GC的过程 -
lgh1992314:
JDK8 HotSpot 方法区在MetaSpace
Java 内存模型 -
空城回转:
永洁童心 写道最后的图中,在afterload_1步骤中,op ...
栈帧、局部变量表、操作数栈 -
永洁童心:
最后的图中,在afterload_1步骤中,operand s ...
栈帧、局部变量表、操作数栈
1.定义
使用共享对象可有效地支持大量的细粒度的对象。
是对象池技术的重要实现方式。
2.享元模式的使用场景
- 系统中存在大量的相似对象。
- 细粒度的对象都具备较接近的外部状态,而且内部状态与环境无关,也就是说对象没有特定身份。
- 需要缓冲池的场景。
请看例子程序,学生和学校的关系:
package _22FlyweightPattern; /** * 班级类 */ public class School { // 学校id private int id; // 学校名称 private String schoolName; // 某学生对该学校的映像 private String desc; // 还有很多信息,比较占内存………… public int getId() { return id; } public void setId(int id) { this.id = id; } public String getSchoolName() { return schoolName; } public void setSchoolName(String schoolName) { this.schoolName = schoolName; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } }
package _22FlyweightPattern; /** * 学生类 */ public class Student { // 学生id private int id; // 学生姓名 private String name; // 学生家庭住址 private String homeAddress; // 所在学校 private School school; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getHomeAddress() { return homeAddress; } public void setHomeAddress(String homeAddress) { this.homeAddress = homeAddress; } public School getSchool() { return school; } public void setSchool(School school) { this.school = school; } }
由于多个学生可以共用一个School对象,因此我们使用享元模式来分析School类。
我们将一个可共用的细粒度对象(上例中的School对象)的信息分为两类
- 内部状态:类似于上面School类中的id、schoolName等等,不会随着环境的变化而变化。
- 外部状态:类似于上面School类中的desc属性,但是要注意,内部状态和外部状态不应该互相影响。外部状态与对象本身无必然关系,外部状态总是因为外界环境的改变而变化,也就是说外部状态是由外界环境来决定的,无论你对学校的映像如何,学校都是同一个。
所谓的享元模式就是将一个类中可共享的部分抽取出来放进对象池,以避免重复创建相同(业务意义上的相同)的对象。
也就是下图所表示的,要将第一张图重构成第二张图:
3.享元模式的四个角色
享元角色就是可共享的角色。
- Flyweight-抽象享元角色:它简单的说就是一个产品的抽象类,同事定义了对象的外部状态和内部状态的接口或实现。
- ConcreteFlyweight-具体享元角色:具体的一个产品类,实现抽象角色定义的业务。该角色需要注意的是内部状态处理应该与环境无关,不应该出现一个操作改变了内部状态,同事又改变了外部状态,这是绝对不允许的。(使用享元模式尽量不要修改内部状态)
- unsharedConcreteFlyweight不可共享的享元角色:一般由N个具体享元角色组合而成,因此它本身不需要被缓存,不必出现在享元工厂中。
- FlyweightFactory享元工厂:职责非常简单,就是构造一个池容器,同事提供从池中获得对象的方法。
下面是享元模式的类图:
4.享元模式的通用代码
package _22FlyweightPattern; /** * 抽象享元角色 */ public abstract class Flyweight { // 内部状态 private String intrinsic; // 外部状态 protected final String extrinsic; // 强制享元角色必须接受外部状态 public Flyweight(String extrinsic) { this.extrinsic = extrinsic; } public String getIntrinsic() { return intrinsic; } public void setIntrinsic(String intrinsic) { this.intrinsic = intrinsic; } // 定义业务逻辑 public abstract void operate(); }
package _22FlyweightPattern; /** * 具体享元角色 */ public class ConcreteFlyweight extends Flyweight { public ConcreteFlyweight(String extrinsic) { super(extrinsic); } @Override public void operate() { // 业务逻辑 } }
package _22FlyweightPattern; import java.util.HashMap; import java.util.Map; /** * 享元工厂 */ public class FlyweightFactory { // 定义一个池容器 private static Map<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; } }
5.享元模式的优缺点
享元模式是一个非常简单的模式,它可以大大减少应用程序创建的对象(比如你使用new School()的方式10000个学生对象就会产生10000个School对象,而通过缓存技术,那么只存在一个School对象),降低程序内存的占用,增强程序的性能,但它同时也提高了系统复杂性,需要分理处内部和外部状态,而且外部状态具有固化特效,不应该随内部状态改变而改变,否则导致系统的逻辑混乱。
6.最佳实践
外部状态最好使用Java的基本类型作为标志,如String、int等,可以大幅提升效率(Map的key值)。
享元模式在Java API中随处可见,比如String会对字符串进行缓存,Integer会对-128到127的数字进行缓存。String的intern方法:如果String对象池中有该类型的值,那么直接返回对象池中的对象。
发表评论
-
设计模式代码-仅供参考
2012-11-26 17:13 819学完设计模式,示例代码保存着,以后看看。 -
23.桥梁模式(Bridge Pattern)
2012-11-26 17:09 18281.定义 将抽象和实现解耦,使得两者可以独立地变化 ... -
21.解析器模式(Interpreter Pattern)
2012-11-23 14:29 45411.定义 给定一门语言,定义它的文法的一种表示,并定义一个解 ... -
20.状态模式(State Pattern)
2012-11-22 14:02 13101.定义 当一个对象内在状态改变时,允许其改变行为,这个对象 ... -
19.访问者模式(Visitor Pattern)
2012-11-19 16:28 1942话说有一个银行,有三 ... -
18.备忘录模式(Memento Pattern)
2012-11-16 15:01 1066引子 俗话说:世上难 ... -
17.门面模式(FacadePattern)
2012-11-15 15:23 10461.定义 要求一个子系统 ... -
16.观察者模式(ObserverPattern)
2012-11-14 16:08 15531.定义 定义对象之间一种一对多的依赖关系,使得每当一个对象 ... -
15.组合模式(Composite Pattern)
2012-11-13 17:35 18041.定义 将对象组合成树形结构以表示“部分-整体”的层次结构 ... -
14.迭代器模式(Iterator Pattern)
2012-11-13 14:27 11791.定义 提供一种方法访 ... -
13.适配器模式(Adapter Pattern)
2012-11-12 17:24 13531.定义 将一个类的接口变换成客户端所期待的另一种接口,从而 ... -
12.策略模式(Strategy Pattern)
2012-11-12 13:51 11241.定义 定义一组算法,将每个算法都封装起来,并且使它们之间 ... -
11.装饰模式(Decorator Pattern)
2012-11-08 15:57 10521.定义 动态地给一个对 ... -
10.责任链模式(Chain of Responsibility)
2012-11-07 16:15 10601.定义: 使多个对象都有机会处理请求,从而避免了请求的发送 ... -
9.命令模式(Command Pattern)
2012-11-07 14:45 10061.定义 将一个请求封装 ... -
8.中介者模式(Mediator Pattern)
2012-11-01 15:57 15261.定义: 用一个中介对象封装一系列的对象交互,中介者使个对 ... -
7.原型模式(Prototype Pattern)
2012-11-01 10:54 13321.定义: 用原型实例指定创建对象的种类,并且通过拷贝这些原 ... -
6.代理模式(Proxy Pattern)
2012-10-30 16:09 11331.定义: 为其他对象提供一种代理以控制这个对象的访问。 ... -
5.建造者模式(Builder Pattern)
2012-10-26 17:06 10311.定义: 将一个复杂对象的构建与它的表示分离,使得同样的构 ... -
4.模板方法模式(Template Method Pattern)
2012-10-25 16:33 1163定义: 定义一个操作中的算法的框架,而将一些步骤延迟到 ...
相关推荐
享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。
享元模式(Flyweight Pattern) 12. 代理模式(Proxy Pattern) 行为型: 13. 模板方法(Template Method) 14. 命令模式(Command Pattern) 15. 迭代器模式(Iterator Pattern) 16. 观察者模式(Observer Pattern) 17. ...
设计模式(C#)之享元模式(Flyweight Pattern),运用共享技术有效地支持大量细粒度的对象。
享元模式(Flyweight Pattern) 12. 代理模式(Proxy Pattern) 13. 模板方法(Template Method) 14. 命令模式(Command Pattern) 15. 迭代器模式(Iterator Pattern) 行为型: 16. 观察者模式(Observer Pattern...
享元模式(Flyweight Pattern) 12. 代理模式(Proxy Pattern) 13. 模板方法(Template Method) 14. 命令模式(Command Pattern) 15. 迭代器模式(Iterator Pattern) 行为型: 16. 观察者模式(Observer Pattern...
11. 享元模式(Flyweight Pattern) 12. 代理模式(Proxy Pattern) 行为型 13. 模板方法(Template Method) 14. 命令模式(Command Pattern) 15. 迭代器模式(Iterator Pattern) 16. 观察者模式(Observer Pattern...
1. 设计模式 1.1 含义 1.2 作用 1.3 设计原则 1.4 分类 2. 简单工厂模式 (SimpleFactoryPattern) ...15. 享元模式 (Flyweight Pattern) 16. 桥接模式 (Bridge Pattern) 17. 观察者模式 (Observer Pattern)
享元模式(Flyweight Pattern) 12. 代理模式(Proxy Pattern) 13. 模板方法(Template Method) 14. 命令模式(Command Pattern) 15. 迭代器模式(Iterator Pattern) 行为型: 16. 观察者...
享元模式英文称为“Flyweight Pattern”,我非常感谢将Flyweight Pattern翻译成享元模式的那位强人,因为这个词将这个模式使用的方式明白得表示了出来;如果翻译成为羽量级模式或者蝇量级模式等等,虽然可以含蓄的...
享元模式(Flyweight Pattern) 代理模式(Proxy Pattern) 3. 行为型模式 责任链模式(Chain of Responsibility Pattern) 命令模式(Command Pattern) 解释器模式(Interpreter Pattern) 迭代器模式...
11. 享元模式(Flyweight Pattern) 12. 代理模式(Proxy Pattern) 13. 模板方法(Template Method) 14. 命令模式(Command Pattern) 15. 迭代器模式(Iterator Pattern) 行为型: 16. 观察者模式(Observer Pattern)...
适配器模式(Adapter Pattern) 提供者模式(Provider Pattern) 外观模式(Facade Pattern) 享元模式(Flyweight Pattern) 原型模式(Prototype Pattern) 责任链模式(Chain of Responsibility Pattern) 中介者模式...
1.简介享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。2.举例当使用Integer.valueOf创建对象
享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度的对象. 下面是一个享元模式的demo: #!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = 'Andy' """ 大话设计模式 设计模式——享元模式 ...
享元模式(Flyweight Pattern) 代理模式(Proxy Pattern) 行为型模式用来对类或对象怎样交互和怎样分配职责进行描述,主要包含以下11种设计模式: 责任链模式(Chain of Responsibility Pattern) ...
享元模式(Flyweight Pattern) 代理模式(Proxy Pattern) 3 行为型模式 这些设计模式特别关注对象之间的通信。 责任链模式(Chain of Responsibility Pattern) 命令模式(Command Pattern) 解释器模式...
扩展系统功能——装饰模式(三) 扩展系统功能——装饰模式(四) 外观模式-Facade Pattern 深入浅出外观模式(一) 深入浅出外观模式(二) 深入浅出外观模式(三) 享元模式-Flyweight Pattern 实现对象的复用——...
什么是Flyweight模式? 享元模式(Flyweight Pattern)是一种软件开发中的设计模式,其主要解决的问题是通过类对象的共享,来避免大量创建拥有相同... 代码如下:/// /// 享元模式Flyweight的实现 /// /// ”T”>Ty
专门用于设计可共享对象的一种设计模式叫做享元模式(Flyweight pattern)。 实现享元模式需要两个关键组件,通常是可共享的享元对象和保存他们的池。某种中央对象维护这个池,并从它返回适当的实例。 运用共享技术...
一、 享元(Flyweight)模式 122 二、 单纯享元模式的结构 122 三、 单纯享元模式的示意性源代码 123 四、 复合享元模式的结构 125 五、 一个咖啡摊的例子 127 六、 咖啡屋的例子 130 七、 享元模式应当在什么情况下...