`

享元模式——Flyweight

 
阅读更多

 

 享元模式——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());
	}
}
 
分享到:
评论

相关推荐

    Python设计模式之享元模式原理与用法实例分析

    设计模式——享元模式 享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度的对象 对一个类进行的实例,只在第一次使用时建立,其他时候是用同一个实例,减少内存的开销 """ # 抽象网站类 class Web

    设计模式代码——c#

    11. 享元模式(Flyweight Pattern) 12. 代理模式(Proxy Pattern) 行为型 13. 模板方法(Template Method) 14. 命令模式(Command Pattern) 15. 迭代器模式(Iterator Pattern) 16. 观察者模式(Observer Pattern...

    设计模式可复用面向对象软件的基础.zip

    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(命令)——对象...

    管理系统javasal源码-Design-Patterns-Demo:超全的设计模式——理论+实现demo

    管理系统java sal源码 [toc] 设计模式 源码地址: 博客地址: 分类 序号 模式 & ...创建型模式:这些设计模式提供了一种在创建对象的同时隐藏创建逻辑...Pattern)享元模式(Flyweight Pattern)代理模式(Proxy Pattern)

    design-pattern-java.pdf

    扩展系统功能——装饰模式(四) 外观模式-Facade Pattern 深入浅出外观模式(一) 深入浅出外观模式(二) 深入浅出外观模式(三) 享元模式-Flyweight Pattern 实现对象的复用——享元模式(一) 实现对象的复用...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷6

    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/...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷8

    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/...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷10

    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/...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷5

    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/...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷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观察者模式 ...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷1

    pattern/src/structure/flyweight //12.7享元模式 pattern/src/behavior/strategy //13.1策略模式 pattern/src/behavior/templatemethod //13.2模板方法模式 pattern/src/behavior/observer //13.3观察者模式 ...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷2

    pattern/src/structure/flyweight //12.7享元模式 pattern/src/behavior/strategy //13.1策略模式 pattern/src/behavior/templatemethod //13.2模板方法模式 pattern/src/behavior/observer //13.3观察者模式 ...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷7

    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/...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷9

    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/...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷4

    pattern/src/structure/flyweight //12.7享元模式 pattern/src/behavior/strategy //13.1策略模式 pattern/src/behavior/templatemethod //13.2模板方法模式 pattern/src/behavior/observer //13.3观察者模式 ...

    C#23种设计模式_示例源代码及PDF

    享元模式:FLYWEIGHT 在拳击比赛中指最轻量级。享元模式以共享的方式高效的支持大量 享元模式 的细粒度对象。 享元模式能做到共享的关键是区分内蕴状态和外蕴状态。 内蕴状态存储在享 元内 部,不会随环境的改变而...

    C#23种设计模式

    11. 享元模式(Flyweight Pattern) 12. 代理模式(Proxy Pattern) 13. 模板方法(Template Method) 14. 命令模式(Command Pattern) 15. 迭代器模式(Iterator Pattern) 行为型: 16. 观察者模式(Observer Pattern)...

    asp.net知识库

    动态调用对象的属性和方法——性能和灵活性兼备的方法 消除由try/catch语句带来的warning 微软的应试题完整版(附答案) 一个时间转换的问题,顺便谈谈搜索技巧 .net中的正则表达式使用高级技巧 (一) C#静态成员和...

Global site tag (gtag.js) - Google Analytics