`
zhangwei_david
  • 浏览: 468927 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java 设计模式-享元模式(Flyweight)

 
阅读更多

    享元模式(Flyweight Pattern)是对象的结构模式。享元模式以共享的方式高效地支持大量细粒度对象的创建。

   享元对象能够做到共享的关键是区分内蕴状态和外蕴状态;内蕴状态就是指不随环境的改变而改变、可以共享的状态,外蕴状态是随环境的改变而改变,不可以共享的状态;因为外蕴状态不可以共享所以外蕴状态的保存时由客户端进行保存的,在需要的时候再传入到享元对象内部。

   在日常的编辑器中,字体的大小样式都是可以改变的,但是字符是的值是一直不变的;输入的A,不管是斜体的还是黑体的它永远都是A。由此可以发现A的值是一个内蕴状态,而A的字体样式是一个外蕴状态。

/**
 *   字母的抽象接口
 * @author zhangwei_david
 * @version $Id: Letter.java, v 0.1 2015年3月26日 下午3:51:13 zhangwei_david Exp $
 */
public interface Letter {

    public void resetFont(String font);
}

 

 

/**
 *
 * @author zhangwei_david
 * @version $Id: Character.java, v 0.1 2015年3月26日 下午3:59:01 zhangwei_david Exp $
 */
public class Character implements Letter {

    private String value;

    public Character(String value) {
        super();
        this.value = value;
    }

    /**
     * @see com.pattern.create.flyweight.Letter#resetFont(java.lang.String)
     */
    @Override
    public void resetFont(String font) {
        System.out.println("字符" + value + "的字体是" + font);
    }

}

 

/**
 *
 * @author zhangwei_david
 * @version $Id: CharacterFactory.java, v 0.1 2015年3月26日 下午4:09:01 zhangwei_david Exp $
 */
public class CharacterFactory {

    private Map<String, Letter>     characters = new HashMap<String, Letter>();

    private static CharacterFactory instance   = new CharacterFactory();

    public static CharacterFactory getInstance() {
        return instance;
    }

    public Letter factory(String value) {
        if (characters.containsKey(value)) {
            return characters.get(value);
        }
        Letter letter = new Character(value);
        characters.put(value, letter);
        return letter;
    }

    public int getObjectSize() {
        return characters.size();
    }
}

 

/**
 *
 * @author zhangwei_david
 * @version $Id: Client.java, v 0.1 2015年3月26日 下午4:14:01 zhangwei_david Exp $
 */
public class Client {

    /**
     *
     * @param args
     */
    public static void main(String[] args) {
        CharacterFactory characterFactory = CharacterFactory.getInstance();
        Letter letter1 = characterFactory.factory("a");
        letter1.resetFont("斜体 10号");

        Letter letter2 = characterFactory.factory("a");
        letter2.resetFont("黑体 10号");
        System.out.println(characterFactory.getObjectSize());
    }

}

 

字符a的字体是斜体 10号
字符a的字体是黑体 10号
1

 可以发现实际创建的对象只有一个,而表象是两个

 

   通过享元模式的定义可以发现不可变对象是天生的享元对象,所有虽说享元对象不一定是不可变的,但是往往将享元对象设计为一个不可变的对象。

 

什么时候使用享元模式

  1. 一个系统中有大量的对象
  2. 这些对象往往消耗大量内存资源
  3. 这些对象中的状态中大部分都可以外部化
  4. 这些对象可以按照内蕴状态可以分为很多组,当把外蕴状态从对象中剔除时,每一组可以仅适用一个对象替代
  5. 系统不依赖于这些对象的身份,换言之这些对象是不可分辨的。
当满足以上情况就可以使用享元模式。
分享到:
评论

相关推荐

    JAVA设计模式chm文档

    设计模式之Flyweight(享元) 行为模式: 设计模式之Template 设计模式之Memento(备忘机制) 设计模式之Observer 设计模式之Chain of Responsibility(职责链) 设计模式之Command 设计模式之State 设计模式之Strategy...

    java版本二十三种设计模式.zip

    - 享元模式(Flyweight) - 观察者模式(Observer) - 模板方法模式(Template Method) - 策略模式(Strategy) - 责任链模式(Chain of Responsibility) - 中介者模式(Mediator) - 访问者模式(Visitor) - 命令模式...

    [Java设计模式(第2版)(Design.Patterns.in.Java).John.Metsker

    第13章 享元(flyweight)模式 122 第14章 构造型模式介绍 130 第15章 构建者(builder)模式 134 第16章 工厂方法(factory method)模式 141 第17章 抽象工厂(abstract factory)模式 148 第18章 原型(prototype)模式 158...

    33种JAVA设计模式DEMO

    享元模式(Flyweight Pattern) 代理模式(Proxy Pattern) 3 行为型模式 这些设计模式特别关注对象之间的通信。 责任链模式(Chain of Responsibility Pattern) 命令模式(Command Pattern) 解释器模式...

    Java设计模式之共享模式/享元模式(Flyweight模式)介绍

    主要介绍了Java设计模式之共享模式/享元模式(Flyweight模式)介绍,本文讲解了为什么使用共享模式/享元模式、如何使用共享模式/享元模式、Flyweight模式在XML等数据源中应用等内容,需要的朋友可以参考下

    java设计模式之Flyweight文.pdf

    java设计模式之Flyweight文.pdf

    Java高手真经 - Java Web系统设计与架构 源代码(一)设计模式

    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设计模式之结构模式

    这是JAVA设计模式中属于结构模式的部分,包括Flyweight(共享模式)、Bridge(桥模式)、Decorator(装饰模式)、Composite(组合模式)、Adapter(适配器模式)、Proxy(代理模式)、Facade (外观模式)的源代码。其中有些模式中...

    java设计模式之Flyweight[归纳].pdf

    java设计模式之Flyweight[归纳].pdf

    java设计模式教程+源代码

    Flyweight ( 享元模式 ) Proxy ( 代理模式 ) Chain of Responsibility ( 责任链模式 ) Command ( 命令模式 ) Interpreter ( 解释器模式 ) Iterator ( 迭代器模式 ) Mediator ( 中介者模式 ) Memento ( 备忘录...

    用Java实现23种设计模式

    用Java实现23种设计模式 1. 创建型模式 工厂模式(Factory Pattern) 抽象工厂模式(Abstract Factory Pattern) 单例模式(Singleton Pattern) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern)...

    研磨设计模式-part2

    第20章 享元模式(Flyweight) 第21章 解释器模式(Interpreter) 第22章 装饰模式(Decorator) 第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) ...

    研磨设计模式-part4

    第20章 享元模式(Flyweight) 第21章 解释器模式(Interpreter) 第22章 装饰模式(Decorator) 第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) ...

    研磨设计模式-part3

    第20章 享元模式(Flyweight) 第21章 解释器模式(Interpreter) 第22章 装饰模式(Decorator) 第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) ...

    JAVA 设计模式PPT

    首先介绍了Java中面向对象特性和技术,逐个分析Abstract Factory;Builder;Prototype;Singleton;Adapter (对象);Bridge;Composite;Decorator;Facade;Flyweight;Proxy;Iterator;Observer等模式

    design-pattern-java.pdf

    实现对象的复用——享元模式(二) 实现对象的复用——享元模式(三) 实现对象的复用——享元模式(四) 实现对象的复用——享元模式(五) 代理模式-Proxy Pattern 设计模式之代理模式(一) 设计模式之代理模式...

    详解Java设计模式编程中的Flyweight享元模式的开发结构

    主要介绍了Java设计模式编程中的Flyweight享元模式的开发结构,享元模式能够最大限度地重用现有的同类对象,需要的朋友可以参考下

    CoreJava-DesignPattern

    创意设计模式 -- Abstract Factory - Done -- Builder - Done -- Factory Method -- Object Pool -- Prototype - Done -- Singleton - Done 结构设计模式 -- Adapter -- Bridge -- Composite -- Decorator - Done ...

    Java面试 java设计模式整理 单例、工厂、策略等 面试使用,学习使用

    12.享元模式(Flyweight) 9 13.模板模式 9 13、策略模式(strategy) 12 14、模板方法模式(Template Method) 13 15、观察者模式(Observer) 14 16、迭代子模式(Iterator) 16 17、责任链模式(Chain of ...

    单例模式源码java-DesignPattern:在个人自学阶段的23种设计模式代码的全部实现,全部使用Java编写,其中还包括各个设计模式在

    在个人自学阶段的23种设计模式代码的全部实现,全部使用Java编写,其中还包括各个设计模式在源码中的使用,每种设计模式都举了一个简单的小例子来进行实现,并加以注释 包名解释 一、DesignPattern 1.1 创建型模式 ...

Global site tag (gtag.js) - Google Analytics