- 浏览: 43542 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
jiangduxi:
您好,请教下这个开源中间件是否适用 IM。尤其是移动通讯中的弱 ...
metaq源码分析(二) -
尔今尔后:
写的很好,简明扼要的概述。谢谢
Java-String类型的参数传递问题
十. 享元模式
整理自 《java与模式》阎宏编著
1.意图:
运用共享技术有效地支持大量细粒度的对象。
2.类图:
单纯享元模式:
复合享元模式:
3.原理:
享元对象能做到共享的关键是区分内蕴状态(Internal State)和外蕴状态(External State)。
一个内蕴状态是存储在享元对象内部的,并且不会随环境改变而有所不同的。因此,一个享元可以具有内蕴状态并可以共享。
一个外蕴状态是随环境改变而改变的,不可以共享状态。享元对象的外蕴状态必须由客户端保存,并在享元对象被创建之后,在需要使用的时候再传到享元对象内部。
外蕴状态不可以影响享元对象的内蕴状态,它们是相互独立的。所有的内蕴状态在对象创建完后就不可再改变。
4.特征:
单纯享元模式:
抽象享元角色:所有的具体享元类的超类,规定出需要实现的公共接口。那些需要外蕴状态的操作可以通过方法的参数传入。
具体享元角色:实现抽象享元角色所规定的接口。如果有内蕴状态的话,必须负责为内蕴状态提供存储空间。享元对象的内蕴状态必须与对象所处的周围环境无关,从而使得享元对象可以在系统内共享。
享元工厂角:负责创建和管理享元角色。本角色必须保证享元对象可以被系统适当地共享。当一个客户端对象调用一个享元对象时,享元工厂角色会检查系统中是否已经有一个符合要求的享元对象。如果有,享元工厂就提供这个已经有的享元对象,如果没有,享元工厂创建一个适当的享元对象。
客户端角色:需要维护一个对所有享元对象的引用。本角色需要自行存储所有享元对象的外蕴状态。
复合享元模式:
抽象享元角色:所有的具体享元类的超类,规定出需要实现的公共接口。那些需要外蕴状态的操作可以通过方法的参数传入。抽象享元的接口使得享元变得可能,但是并不强制子类实行共享,因此并非所有的享元对象都是可以共享的。
具体享元角色:实现抽象享元角色所规定的接口。如果有内蕴状态的话,必须负责为内蕴状态提供存储空间。享元对象的内蕴状态必须与对象所处的周围环境无关,从而使得享元对象可以在系统内共享。复合享元角色是由具体享元角色通过复合而成。
复合享元角色:复合享元角色所代表的对象是不可以共享的,但是可以分解成多个可以共享的具体享元角色。
享元工厂角:负责创建和管理享元角色。本角色必须保证享元对象可以被系统适当地共享。当一个客户端对象调用一个享元对象时,享元工厂角色会检查系统中是否已经有一个符合要求的享元对象。如果有,享元工厂就提供这个已经有的享元对象,如果没有,享元工厂创建一个适当的享元对象。
客户端角色:需要维护一个对所有享元对象的引用。本角色需要自行存储所有享元对象的外蕴状态。
5.说明:
6.使用案例:
Java中的String对象。
在编辑器系统中,每个字母做成一个享元对象,内蕴状态就是这个字母,而字母在文本中的位置和风格就是外蕴状态。
7.代码:
单纯享元模式:
// Client.java
public class Client
{
private FlyweightFactory flyweightFactory = null;
public Client()
{
flyweightFactory = new FlyweightFactory();
}
}
// FlyweightFactory.java
public class FlyweightFactory
{
private flyweight.Flyweight lnkFlyweight;
private HashMap flyweightPools;
public FlyweightFactory()
{
flyweightPools = new HashMap();
}
//客户端不能直接实例化享元类,必须通过工厂类。
public Flyweight getFlyweight(Object key)
{
if (flyweightPools.containsKey(key))
{
return (Flyweight) flyweightPools.get(key);
}
else
{
Flyweight newFlyweight = new ConcreteFlyweight(key);
flyweightPools.put(key, newFlyweight);
return newFlyweight;
}
}
}
// Flyweight.java
public interface Flyweight
{
//一个示意性的方法,参数是外蕴状态
void sampleOperation(Object extrinsicState);
}
// ConcreteFlyweight.java
public class ConcreteFlyweight implements Flyweight
{
private Object intrisnicState;
//构造函数,内蕴状态作为参数传入,
public ConcreteFlyweight(Object intrisnicState)
{
// initialize internal state
this.intrisnicState = intrisnicState;
}
//外蕴状态作为参数传入,修改了方法的行为,不改变内蕴状态。
public void sampleOperation(Object extrinsicState)
{
//....
}
}
整理自 《java与模式》阎宏编著
1.意图:
运用共享技术有效地支持大量细粒度的对象。
2.类图:
单纯享元模式:
复合享元模式:
3.原理:
享元对象能做到共享的关键是区分内蕴状态(Internal State)和外蕴状态(External State)。
一个内蕴状态是存储在享元对象内部的,并且不会随环境改变而有所不同的。因此,一个享元可以具有内蕴状态并可以共享。
一个外蕴状态是随环境改变而改变的,不可以共享状态。享元对象的外蕴状态必须由客户端保存,并在享元对象被创建之后,在需要使用的时候再传到享元对象内部。
外蕴状态不可以影响享元对象的内蕴状态,它们是相互独立的。所有的内蕴状态在对象创建完后就不可再改变。
4.特征:
单纯享元模式:
抽象享元角色:所有的具体享元类的超类,规定出需要实现的公共接口。那些需要外蕴状态的操作可以通过方法的参数传入。
具体享元角色:实现抽象享元角色所规定的接口。如果有内蕴状态的话,必须负责为内蕴状态提供存储空间。享元对象的内蕴状态必须与对象所处的周围环境无关,从而使得享元对象可以在系统内共享。
享元工厂角:负责创建和管理享元角色。本角色必须保证享元对象可以被系统适当地共享。当一个客户端对象调用一个享元对象时,享元工厂角色会检查系统中是否已经有一个符合要求的享元对象。如果有,享元工厂就提供这个已经有的享元对象,如果没有,享元工厂创建一个适当的享元对象。
客户端角色:需要维护一个对所有享元对象的引用。本角色需要自行存储所有享元对象的外蕴状态。
复合享元模式:
抽象享元角色:所有的具体享元类的超类,规定出需要实现的公共接口。那些需要外蕴状态的操作可以通过方法的参数传入。抽象享元的接口使得享元变得可能,但是并不强制子类实行共享,因此并非所有的享元对象都是可以共享的。
具体享元角色:实现抽象享元角色所规定的接口。如果有内蕴状态的话,必须负责为内蕴状态提供存储空间。享元对象的内蕴状态必须与对象所处的周围环境无关,从而使得享元对象可以在系统内共享。复合享元角色是由具体享元角色通过复合而成。
复合享元角色:复合享元角色所代表的对象是不可以共享的,但是可以分解成多个可以共享的具体享元角色。
享元工厂角:负责创建和管理享元角色。本角色必须保证享元对象可以被系统适当地共享。当一个客户端对象调用一个享元对象时,享元工厂角色会检查系统中是否已经有一个符合要求的享元对象。如果有,享元工厂就提供这个已经有的享元对象,如果没有,享元工厂创建一个适当的享元对象。
客户端角色:需要维护一个对所有享元对象的引用。本角色需要自行存储所有享元对象的外蕴状态。
5.说明:
6.使用案例:
Java中的String对象。
在编辑器系统中,每个字母做成一个享元对象,内蕴状态就是这个字母,而字母在文本中的位置和风格就是外蕴状态。
7.代码:
单纯享元模式:
// Client.java
public class Client
{
private FlyweightFactory flyweightFactory = null;
public Client()
{
flyweightFactory = new FlyweightFactory();
}
}
// FlyweightFactory.java
public class FlyweightFactory
{
private flyweight.Flyweight lnkFlyweight;
private HashMap flyweightPools;
public FlyweightFactory()
{
flyweightPools = new HashMap();
}
//客户端不能直接实例化享元类,必须通过工厂类。
public Flyweight getFlyweight(Object key)
{
if (flyweightPools.containsKey(key))
{
return (Flyweight) flyweightPools.get(key);
}
else
{
Flyweight newFlyweight = new ConcreteFlyweight(key);
flyweightPools.put(key, newFlyweight);
return newFlyweight;
}
}
}
// Flyweight.java
public interface Flyweight
{
//一个示意性的方法,参数是外蕴状态
void sampleOperation(Object extrinsicState);
}
// ConcreteFlyweight.java
public class ConcreteFlyweight implements Flyweight
{
private Object intrisnicState;
//构造函数,内蕴状态作为参数传入,
public ConcreteFlyweight(Object intrisnicState)
{
// initialize internal state
this.intrisnicState = intrisnicState;
}
//外蕴状态作为参数传入,修改了方法的行为,不改变内蕴状态。
public void sampleOperation(Object extrinsicState)
{
//....
}
}
发表评论
-
httpclient应用
2015-05-14 17:50 523httpclient应用: 准 ... -
Spring AOP+ehCache 页面、对象缓存
2014-11-10 14:11 469使用aop来实现一个Cache简单的解决方案,具体需求如下 ... -
并发程序设计详解
2014-11-05 17:57 674Java性能优化系列之三--并发程序设计详解 来源: ... -
并发程序设计-java.util.concurrent介绍
2014-11-05 17:48 698并发程序设计-java.util ... -
java 并发
2014-11-05 14:07 409文章来源:http://dapple.iteye.com/b ... -
Xms Xmx PermSize MaxPermSize 区别
2014-11-04 11:43 550来源: http://www.cnblogs.com/mi ... -
java nio 简介
2014-11-01 16:06 5391. 基本 概念 IO 是主 ... -
Java-String类型的参数传递问题
2014-10-20 16:00 714刚才看见一个兄弟在为Java的String传值/传引用问题困 ... -
encode,decode
2014-07-15 11:41 0public class Decode{ public S ... -
JMS实现简单聊天程序
2014-06-25 17:58 1094使用了JMS的开源实现activemq消息中间件。各版本都 ... -
设计模式:代理模式
2014-06-04 17:35 475设计模式 代理模式:给某一对象提供代理对象,并由代理对象 ... -
设计模式:单例模式singleton示例分析
2014-06-03 13:16 588public class singleton { pr ... -
Swing Worker应用举例
2014-05-29 12:53 610在开发Java Swing应用程序的过程中,有两个原则是必须 ... -
浅析SwingWorker
2014-05-29 02:05 746正确理解和 ... -
SwingWorker分析
2014-05-29 00:52 632SwingWorker可以帮助我们在后台执行耗时的任务,而避 ... -
SwingUtilities中invokeLater
2014-05-29 00:31 1575在Java中Swing是线程不安全的,是单线程的设 ... -
SwingUtilities中invokeLater和invokeAndWait介绍
2014-05-28 23:25 470SwingUtilities中invokeLater和invo ... -
POI与JXL 操作excel比较
2014-05-06 10:36 961POI是一个标准的Apache项目,提供了完整的接口,不过也 ... -
JXL操作EXCEL
2014-05-06 10:10 493public ImpExpRecord upLoadExc ... -
POI导出EXCEL
2014-05-06 09:49 558import java.sql.ResultSet;impo ...
相关推荐
如适配器模式(Adapter)、桥接模式(Bridge)、组合模式(Composite)、装饰者模式(Decorator)、外观模式(Facade)、享元模式(Flyweight)和代理模式(Proxy)等。 - **行为型模式**:关注于对象间的职责分配,...
4.6 flyweight(享元)—对象结构型 模式 128 4.7 proxy(代理)—对象结构型 模式 137 4.8 结构型模式的讨论 144 4.8.1 adapter与bridge 144 4.8.2 composite、decorator与proxy 145 第5章 行为模式 147 ...
享元模式是一种软件设计模式,它的主要目的是为了提高性能,减少对象的创建,尤其是在大量相似对象需要被创建的情况下。在给定的咖啡店案例中,享元模式的应用可以帮助优化内存使用,避免为每杯咖啡的配料表分配独立...
享元模式是软件设计模式中的一种结构型模式,它的主要目的是为了提高性能,尤其是在大量对象创建时。享元模式通过共享已有对象来减少内存中对象的数量,从而达到降低内存消耗的效果。这种模式适用于那些轻量级对象,...
《设计模式:可复用面向对象软件的基础》一书介绍了23种经典的设计模式,这些模式大致可以分为三大类: 1. **创建型模式**:专注于对象的创建机制,确保系统在合适的时机创建正确的对象。 - **单例模式**...
享元模式是软件设计模式中的一种结构型模式,它的主要目的是为了提高性能,尤其是在大量对象创建时。在享元模式中,系统会共享那些具有大量相同状态的对象,从而减少内存中对象的数量,达到节省内存的目的。Java作为...
结构型模式的例子有适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式和代理模式。 3. 行为型模式:这些模式涉及类或对象的职责分配,它们描述了如何对各个类或对象之间如何分配职责以及如何协调它们...
享元模式是软件设计模式中的一种结构型模式,它的主要目的是通过共享大量细粒度对象来减少内存的使用,提高系统性能。在许多场景下,尤其是处理大量相似对象时,享元模式能显著减少内存开销。这个压缩包文件...
享元模式是一种优化资源使用的软件设计模式,尤其适用于对象创建成本较高或系统内存有限的场景。在Java等面向对象编程语言中,享元模式通过共享大量相似对象来减少内存消耗,提高性能。在这个名为"designPattern8"的...
设计模式面面观(14):享元模式(Facade Pattern)-结构型模式 http://blog.csdn.net/fanweiwei/archive/2008/04/25/2326692.aspx
2. **结构型模式**:如适配器模式、装饰器模式、代理模式、桥接模式、组合模式、外观模式和享元模式。这些模式关注如何将类或对象以某种方式组合起来,以实现新的功能或改善现有结构。 3. **行为型模式**:包括责任...
本文实例讲述了javascript 设计模式之享元模式。分享给大家供大家参考,具体如下: 享元模式说明 定义:用于解决一个系统大量细粒度对象的共享问题: 关健词:分离跟共享; 说明: 享元模式分单纯(共享)享元模式,...
享元模式是软件设计模式中的一种结构型模式,它的核心思想是通过共享已经存在的对象来减少内存中的对象数量,从而提高系统性能。在Java中,享元模式常用于处理大量相似对象的场景,例如在图形界面中绘制大量相似的...
总的来说,《设计模式:可复用面向对象软件的基础》是一本深入理解和应用面向对象设计的必备书籍,它不仅介绍了23种核心设计模式,还提供了大量实例和解释,帮助读者将理论知识转化为实际的编程技巧。通过对这本书的...
在这个“C#面向对象设计模式纵横谈(12)”中,我们将深入探讨享元模式的概念、实现方式以及如何在实际项目中应用。 享元模式的核心思想是区分对象的状态和行为。状态分为内部状态和外部状态,其中内部状态是对象共有...
享元模式是一种结构型设计模式,它通过共享已有对象来减少内存中对象的数量,从而达到降低系统内存占用、提高性能的目的。在软件工程中,当系统中存在大量相似或重复的对象时,享元模式尤为适用。 享元模式的核心是...