- 浏览: 532994 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (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 897本章的前两节“10.1 状态机”、“10.2 ... -
工厂方法和抽象工厂——Factory Method & Abstract Factory
2012-01-04 17:14 2049一、使用抽象工厂和工厂方法 Factory Me ... -
单例模式——Singleton
2012-01-04 17:08 975public class Singleton { ... -
观察者模式——Observer
2012-01-04 16:25 1280观察者模式—— Observer ... -
适配器模式——Adaptor(Adapter)
2012-01-01 18:23 1367适配器模式 —— Adapto ... -
状态模式——State (更好的实现状态机)
2011-12-28 14:10 655801. 概述 The intent o ... -
装饰者模式——Decorator
2011-12-25 11:11 1140装饰者模式—— Decorator ... -
组合模式——Composite
2011-12-24 14:27 9731. Composite 定义 : ... -
构造者模式——Builder
2011-08-10 13:59 1030构造者模式——Builder 本文是《Java设计模 ... -
责任链模式——Chain of Responsibility
2011-08-10 11:26 892一、总结《Java设计模式》Chapter12 Chain o ... -
代理模式Dynamic Proxies(四、Struts2.0拦截器Interceptor)
2011-08-01 11:31 1378一、概念和注意点: Once you write a d ... -
代理模式Remote Proxies(三、RMI)
2011-08-01 09:51 1665因为我本科毕业设计中大量采用RMI实现分布式,且使用了Ecli ... -
代理模式Image Proxies(二、最朴素实现)
2011-07-31 11:55 955在前面《 代理模式Image Proxies(一、最朴素实现) ... -
命令模式——Command
2011-06-10 10:31 912偷懒一下,直接用JavaEye上chjavach老兄的文章了, ... -
代理模式Image Proxies(一、最朴素实现)
2011-06-03 09:27 1022A Classic Example: Image Prox ... -
策略模式——strategy
2011-06-02 12:36 847Strategy Pattern ...
相关推荐
设计模式——享元模式 享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度的对象 对一个类进行的实例,只在第一次使用时建立,其他时候是用同一个实例,减少内存的开销 """ # 抽象网站类 class Web
11. 享元模式(Flyweight Pattern) 12. 代理模式(Proxy Pattern) 行为型 13. 模板方法(Template Method) 14. 命令模式(Command Pattern) 15. 迭代器模式(Iterator Pattern) 16. 观察者模式(Observer 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 ...
4.6 FLYWEIGHT(享元)——对象结构型模式 4.7 PROXY(代理)——对象结构型模式 4.8 结构型模式的讨论 第五章 行为模式 5.1 CHAIN OF RESPONSIBIL ITY(职责链)——对象行为型模式 5.2 COMMAND(命令)——对象...
管理系统java sal源码 [toc] 设计模式 源码地址: 博客地址: 分类 序号 模式 & ...创建型模式:这些设计模式提供了一种在创建对象的同时隐藏创建逻辑...Pattern)享元模式(Flyweight Pattern)代理模式(Proxy Pattern)
扩展系统功能——装饰模式(四) 外观模式-Facade Pattern 深入浅出外观模式(一) 深入浅出外观模式(二) 深入浅出外观模式(三) 享元模式-Flyweight Pattern 实现对象的复用——享元模式(一) 实现对象的复用...
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/...
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/...
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/...
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/...
pattern/src/structure/flyweight //12.7享元模式 pattern/src/behavior/strategy //13.1策略模式 pattern/src/behavior/templatemethod //13.2模板方法模式 pattern/src/behavior/observer //13.3观察者模式 ...
pattern/src/structure/flyweight //12.7享元模式 pattern/src/behavior/strategy //13.1策略模式 pattern/src/behavior/templatemethod //13.2模板方法模式 pattern/src/behavior/observer //13.3观察者模式 ...
pattern/src/structure/flyweight //12.7享元模式 pattern/src/behavior/strategy //13.1策略模式 pattern/src/behavior/templatemethod //13.2模板方法模式 pattern/src/behavior/observer //13.3观察者模式 ...
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/...
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/...
pattern/src/structure/flyweight //12.7享元模式 pattern/src/behavior/strategy //13.1策略模式 pattern/src/behavior/templatemethod //13.2模板方法模式 pattern/src/behavior/observer //13.3观察者模式 ...
享元模式:FLYWEIGHT 在拳击比赛中指最轻量级。享元模式以共享的方式高效的支持大量 享元模式 的细粒度对象。 享元模式能做到共享的关键是区分内蕴状态和外蕴状态。 内蕴状态存储在享 元内 部,不会随环境的改变而...
11. 享元模式(Flyweight Pattern) 12. 代理模式(Proxy Pattern) 13. 模板方法(Template Method) 14. 命令模式(Command Pattern) 15. 迭代器模式(Iterator Pattern) 行为型: 16. 观察者模式(Observer Pattern)...
动态调用对象的属性和方法——性能和灵活性兼备的方法 消除由try/catch语句带来的warning 微软的应试题完整版(附答案) 一个时间转换的问题,顺便谈谈搜索技巧 .net中的正则表达式使用高级技巧 (一) C#静态成员和...