`
zhangwei_david
  • 浏览: 474769 次
  • 性别: 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版

    包括适配器模式(Adapter)、桥接模式(Bridge)、装饰器模式(Decorator)、外观模式(Facade)、组合模式(Composite)、享元模式(Flyweight)和代理模式(Proxy)。这些模式可以帮助我们更好地组织代码,实现...

    6.设计模式-享元模式1

    设计模式-享元模式 设计模式是软件设计中的一种解决方案,旨在提高代码的可维护性、灵活性和可重用性。享元模式(Flyweight Pattern)是结构型模式的一种,主要用于减少大量相似对象的内存占用,提高系统的性能和...

    java基础设计模式模式 - 享元模式.7z

    享元模式是一种优化资源使用的软件设计模式,尤其适用于对象创建成本较高或系统内存有限的场景。在Java编程中,享元模式通过共享已有对象来减少内存中的对象数量,从而提高性能。这种模式的核心是实现细粒度对象的...

    Java设计模式之享元模式

    享元模式是软件设计模式中的一种结构型模式,它的核心思想是通过共享已经存在的对象来减少内存中的对象数量,从而提高系统性能。在Java中,享元模式常用于处理大量相似对象的场景,例如在图形界面中绘制大量相似的...

    JAVA设计模式--入门

    5. 享元模式(Flyweight):通过共享技术,有效地支持大量细粒度的对象。 6. 装饰模式(Decorator):动态地给对象添加新的职责,装饰者和被装饰对象有相同的接口。 **行为型设计模式** 1. 责任链模式(Chain of ...

    《Java设计模式》课后答案-刘伟.rar

    结构型设计模式包括适配器(Adapter)、桥接(Bridge)、装饰(Decorator)、外观(Facade)、享元(Flyweight)、组合(Composite)和代理(Proxy)。这些模式帮助我们更好地组织类和对象之间的关系,实现松耦合,...

    JAVA design pattern-java设计模式

    结构型模式涉及到如何组合类和对象以形成更大的结构,例如适配器(Adapter)、装饰器(Decorator)、桥接(Bridge)、组合(Composite)、外观(Facade)、享元(Flyweight)和代理(Proxy)。这些模式有助于改善...

    设计模式的享元模式的例子

    享元模式是软件设计模式中的一种结构型模式,它的主要目的是通过共享大量细粒度对象来减少内存的使用,提高系统性能。在许多场景下,尤其是处理大量相似对象时,享元模式能显著减少内存开销。这个压缩包文件...

    《java设计模式》课后习题模拟试题解答——刘伟.zip

    2. **结构型模式**:如适配器(Adapter)、装饰器(Decorator)、代理(Proxy)、桥接(Bridge)、组合(Composite)、外观(Facade)和享元(Flyweight)。这些模式处理对象的组合和关系,提供更好的结构和接口,...

    java-design-patterns-master_JAVAdesignpattens_java_design_

    11. **享元模式(Flyweight Pattern)**:用于减少创建对象的数量,以提高效率,特别适用于大量细粒度对象的场景。 12. **观察者模式(Observer Pattern)**:定义了对象之间的一对多依赖关系,当一个对象的状态...

    设计模式之享元模式

    享元模式是软件设计模式中的一种结构型模式,它的主要目的是为了提高性能,尤其是在大量对象创建时。享元模式通过共享已有对象来减少内存中对象的数量,从而达到降低内存消耗的效果。这种模式适用于那些轻量级对象,...

    JAVA设计模式chm文档

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

    设计模式--java版.rar

    本资源“设计模式--java版.rar”提供了一种深入理解和应用Java设计模式的方式。 在Java开发中,设计模式主要分为三大类:创建型模式、结构型模式和行为型模式。创建型模式如单例(Singleton)、工厂方法(Factory ...

    设计模式之轻量级Flyweight

    本文将深入探讨“轻量级”设计模式之一——Flyweight(享元)模式,它是如何在减少内存消耗的同时提高系统性能的。 Flyweight模式的核心思想是共享对象,通过复用大量相似对象来减少内存占用。这种模式通常在处理...

    《Java设计模式》模拟试题参考答案及评分标准-刘伟(20180723).pdf

    根据提供的文档信息,我们可以从这份《Java设计模式》模拟试题参考答案及评分标准中提炼出以下关键知识点: ### 一、基础知识与概念 #### 1. 设计模式基础概念 - **里氏替换原则**(Liskov Substitution Principle...

    23种java设计模式.pdf

    " JAVA 设计模式概述" JAVA 设计模式是指在软件设计过程中,为了提高代码的可维护性、灵活性和可扩展性所使用的一些惯用解决方案。JAVA 设计模式可以分为三种:创建模式、结构模式和行为模式。 1. 创建模式 创建...

    设计模式-java实现代码汇总

    11. 享元模式(Flyweight):有效地使用共享对象,减少内存中的对象数量。 12. 代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。 **行为型设计模式**: 13. 责任链模式(Chain of ...

    Java设计模式刘伟书本中模拟考试答案

    在《Java设计模式》这本书的模拟试题及其参考答案中,涉及了多条设计模式的知识点,以及它们的应用场景和实现方法。现在将这些知识点详细地解释如下: 1. 开闭原则(Open-Closed Principle, OCP): 开闭原则是面向...

Global site tag (gtag.js) - Google Analytics