- 浏览: 543727 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (231)
- 一个操作系统的实现 (20)
- 汇编(NASM) (12)
- Linux编程 (11)
- 项目管理 (4)
- 计算机网络 (8)
- 设计模式(抽象&封装) (17)
- 数据结构和算法 (32)
- java基础 (6)
- UML细节 (2)
- C/C++ (31)
- Windows (2)
- 乱七八糟 (13)
- MyLaB (6)
- 系统程序员-成长计划 (8)
- POJ部分题目 (10)
- 数学 (6)
- 分布式 & 云计算 (2)
- python (13)
- 面试 (1)
- 链接、装载与库 (11)
- java并行编程 (3)
- 数据库 (0)
- 体系结构 (3)
- C++ template / STL (4)
- Linux环境和脚本 (6)
最新评论
-
chuanwang66:
默默水塘 写道typedef void(*Fun)(void) ...
C++虚函数表(转) -
默默水塘:
typedef void(*Fun)(void);
C++虚函数表(转) -
lishaoqingmn:
写的很好,例子简单明了,将观察者模式都表达了出来。
这里是ja ...
观察者模式——Observer
享元模式——Flyweight
1. 概念
享元模式 (Flyweight ,轻量级选手 ) 就是利用可共享对象的池。因而,通常用到 Factory ,称为 Flyweight Factory 享元工厂 。 (Sam)
将对象定义为不可变 (immutable) 的是避免客户代码之间相互影响最简单方法, Java 语言中最常见的不可变对象 是 String 类对象 (public final class String{...}) 。在 Oozinoz 公司的例子中,化学物 Substance_Before 类对象中包含两种类型的属性——可变部分 ( 重量等 )& 不可变部分 ( 原子量,名称,化学式 ) ,我们将不变部分抽象 为另一个类 Chemical ,从而将 Substance_Before 改造为 Substance_After 。这样,当系统中 Substance 对象很多时,不必为每个对象维护众多的不变部分信息 ( 可以共享少量 Chemical 实例 ) 。
因此,享元模式使用 的过程实际上是个源码重构 的过程,可以在最终的代码中看不出享元的痕迹(例如 BorderFactory 类),看起来很像 Factory 模式。
然而,将对象的不可变部分提取出来仅是使用享元模式的前面一半工作。后一半工作是创建一个享元工厂 Chemical_Factory ,用于实例化享元,并组织共享享元的客户代码。另外,为了保证客户代码使用享元工厂获取享元,而非自己创建,可以限定 Chemical 的可见性:将 Chemical 作为 Chemical Factory 的内部类 。
举例: BorderFactory 是典型的 Flyweight Factory :
javax.swing.BorderFactory - Factory class for vending(vt. vi. 出售,贩卖 ) standard Border objects. Wherever possible, this factory will hand out( 分发;施舍;把…拿出来 ) references to shared Border instances.
javax.swing.Border - Provides classes and interfaces for drawing specialized borders around a Swing component.
public class BorderFactory{
final static Border emptyBorder=new EmptyBorder(0,0,0,0);
public static Border createEmptyBorder(){ return emptyBorder;}
}
2. 享元模式使用:
将 Substance_Before 重构为 Substance_After&Chemical ;
但为了保证客户代码用享元工厂获取享元对象,在 Substance_After 中编写 ChemicalImpl( 实现 Chemical 接口,这样方便从 Substance_After 中引用到接口 ) 。
public class Substance_Before { /* * 可变部分 */ private double grams ; /* 重量 i.e. 75g*/ /* * 不可变部分 */ private String name ; /* 化学名称 i.e. Saltpeter */ private String symbol ; /* 化学式 i.e. KNO3*/ private double atomicWeight ; /* 原子量 i.e. 101*/ public double getMoles (){ return grams / atomicWeight ; } }
*****************************************************************
使用享元模式重构后:
public class Substance_After { /* * 可变部分 */ private double grams ; /* * 不可变部分 * 抽象为类 Chemical 对象 ! * 好处:当 Substance_After 对象很多时,可以引用少量的 * Chemical 实例;而不必自身维护大量不变部分信息。 */ private Chemical chemical ; /* 使用接口来访问不变对象 */ public double getMoles(){ return grams / chemical .getAtomicWeight(); } }
public class Chemical_Factory { private static Map chemicals = new HashMap (); static { chemicals .put( "carbon" , new ChemicalImpl( "Carbon" , "C" ,22)) ; chemicals .put( "sulfur" , new ChemicalImpl( "Sulfur" , "S" ,32)) ; chemicals .put( "saltpeter" , new ChemicalImpl( "Saltpeter" , "KNO3" ,101)) ; } /* * 1. static 修饰类时只能用于内部类,不能用于普通类 * 2. static 内部类中的 static 成员(类成员)和对象成员都作为对象成员使用 ! */ private static class ChemicalImpl implements Chemical { private String name ; /* 化学名称 i.e. Saltpeter */ private String symbol ; /* 化学式 i.e. KNO3*/ private double atomicWeight ; /* 原子量 i.e. 101*/ private ChemicalImpl(String name,String symbol, double atomicWeight){ this . name =name; this . symbol =symbol; this . atomicWeight =atomicWeight; } public double getAtomicWeight() { return atomicWeight ; } public String getName() { return name ; } public String getSymbol() { return symbol ; } } public static Chemical getChemical(String name){ return (Chemical) chemicals .get(name.toLowerCase()); } }
public interface Chemical { String getName(); String getSymbol(); double getAtomicWeight(); }
采用享元模式后,客户端调用方法:
public class Main { public static void main(String[] args) { Substance_After s1=new Substance_After(75,Chemical_Factory.getChemical("SALTPETER")); Substance_After s2=new Substance_After(150,Chemical_Factory.getChemical("saltpeter")); System.out.println(s1.getMoles()); System.out.println(s2.getMoles()); } }
发表评论
-
(第十章)一个xml解析器和构造器
2013-03-10 16:40 928本章的前两节“10.1 状态机”、“10.2 ... -
工厂方法和抽象工厂——Factory Method & Abstract Factory
2012-01-04 17:14 2092一、使用抽象工厂和工厂方法 Factory Me ... -
单例模式——Singleton
2012-01-04 17:08 1008public class Singleton { ... -
观察者模式——Observer
2012-01-04 16:25 1323观察者模式—— Observer ... -
适配器模式——Adaptor(Adapter)
2012-01-01 18:23 1505适配器模式 —— Adapto ... -
状态模式——State (更好的实现状态机)
2011-12-28 14:10 656641. 概述 The intent o ... -
装饰者模式——Decorator
2011-12-25 11:11 1181装饰者模式—— Decorator ... -
组合模式——Composite
2011-12-24 14:27 10111. Composite 定义 : ... -
构造者模式——Builder
2011-08-10 13:59 1072构造者模式——Builder 本文是《Java设计模 ... -
责任链模式——Chain of Responsibility
2011-08-10 11:26 935一、总结《Java设计模式》Chapter12 Chain o ... -
代理模式Dynamic Proxies(四、Struts2.0拦截器Interceptor)
2011-08-01 11:31 1420一、概念和注意点: Once you write a d ... -
代理模式Remote Proxies(三、RMI)
2011-08-01 09:51 1711因为我本科毕业设计中大量采用RMI实现分布式,且使用了Ecli ... -
代理模式Image Proxies(二、最朴素实现)
2011-07-31 11:55 998在前面《 代理模式Image Proxies(一、最朴素实现) ... -
命令模式——Command
2011-06-10 10:31 951偷懒一下,直接用JavaEye上chjavach老兄的文章了, ... -
代理模式Image Proxies(一、最朴素实现)
2011-06-03 09:27 1065A Classic Example: Image Prox ... -
策略模式——strategy
2011-06-02 12:36 901Strategy Pattern ...
相关推荐
1. **抽象享元(Flyweight)**:这是享元模式的接口,定义了所有享元对象公共的行为。 2. **具体享元(Concrete Flyweight)**:实现了抽象享元接口,提供了具体的业务逻辑。这些对象是可以共享的,并且通常存储在一...
本文将深入探讨“轻量级”设计模式之一——Flyweight(享元)模式,它是如何在减少内存消耗的同时提高系统性能的。 Flyweight模式的核心思想是共享对象,通过复用大量相似对象来减少内存占用。这种模式通常在处理...
设计模式——享元模式 享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度的对象 对一个类进行的实例,只在第一次使用时建立,其他时候是用同一个实例,减少内存的开销 """ # 抽象网站类 class Web
11. 享元模式(Flyweight Pattern) 12. 代理模式(Proxy Pattern) 行为型 13. 模板方法(Template Method) 14. 命令模式(Command Pattern) 15. 迭代器模式(Iterator Pattern) 16. 观察者模式(Observer Pattern...
在本文中,我们将深入探讨一种重要的设计模式——享元模式(Flyweight Pattern)。 享元模式是一种结构型设计模式,它的主要目标是有效地支持大量细粒度的对象,通过共享已经存在的对象来减少内存消耗。在面向对象...
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 5.1 CHAIN ...
管理系统java sal源码 [toc] 设计模式 源码地址: 博客地址: 分类 序号 模式 & ...创建型模式:这些设计模式提供了一种在创建对象的同时隐藏创建逻辑...Pattern)享元模式(Flyweight Pattern)代理模式(Proxy Pattern)
2. **结构型模式**:如适配器(Adapter)、装饰器(Decorator)、代理(Proxy)、桥接(Bridge)、组合(Composite)、外观(Facade)和享元(Flyweight)。这些模式处理对象的组合和关系,提供更好的结构和接口,...
2. **结构型模式**:如适配器模式(Adapter)、装饰器模式(Decorator)、代理模式(Proxy)、桥接模式(Bridge)、组合模式(Composite)、外观模式(Facade)和享元模式(Flyweight)。这些模式处理对象之间的关系...
扩展系统功能——装饰模式(四) 外观模式-Facade Pattern 深入浅出外观模式(一) 深入浅出外观模式(二) 深入浅出外观模式(三) 享元模式-Flyweight Pattern 实现对象的复用——享元模式(一) 实现对象的复用...
包括适配器模式(Adapter)、桥接模式(Bridge)、装饰器模式(Decorator)、组合模式(Composite)、外观模式(Facade)、享元模式(Flyweight)和代理模式(Proxy)。它们帮助我们在不同的对象之间建立关系,实现...
常见的结构型模式有适配器模式(Adapter)、装饰器模式(Decorator)、代理模式(Proxy)、桥接模式(Bridge)、组合模式(Composite)、外观模式(Facade)和享元模式(Flyweight)。 3. 行为型模式:这一类模式...
10. 享元模式(Flyweight Pattern): 享元模式有效地共享对象,减少内存使用。例如,在文本编辑器中,可以使用享元模式只存储一个字符对象,但能表示文本中的多次出现。 以上就是Java设计模式的一些核心概念和应用...
6. 享元模式(Flyweight):为了减少大量相似对象的创建,共享内存中的对象。 7. 代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。 行为型模式则关注对象之间的交互和责任分配,包括: 1. 责任...
结构型模式处理对象组合和类的结构,例如适配器模式(Adapter)、装饰器模式(Decorator)、代理模式(Proxy)、桥接模式(Bridge)、组合模式(Composite)、外观模式(Facade)和享元模式(Flyweight)。...
**Java设计模式——深入解析与应用** 在编程领域,设计模式是解决常见问题的经验总结,是一种通用、可重用的解决方案。Java设计模式是面向对象编程中的精华,它为开发者提供了一套标准的方法来处理软件设计中的常见...
享元模式(Flyweight) 享元模式是一种结构型设计模式,它用于减少创建大量相同或相似对象时的内存开销。该模式通过共享技术来有效地支持大量细粒度的对象。文章中通过“MM打招呼”的例子,展示了如何通过享元模式...
5. 享元模式(Flyweight):通过共享技术,有效地支持大量细粒度的对象。 6. 装饰模式(Decorator):动态地给对象添加新的职责,装饰者和被装饰对象有相同的接口。 **行为型设计模式** 1. 责任链模式(Chain of ...
pattern/src/structure/facade //12.4外观模式 pattern/src/structure/bridge //12.5桥接模式 pattern/src/structure/composite //12.6组合模式 pattern/src/structure/flyweight //12.7享元模式 pattern/src/...