二十一、享元设计模式

1. 享元设计模式介绍

享元模式用来尽可能减少内存使用量,它适合用于可能存在大量重复对象的场景,用来缓存可共享的对象,达到对象共享、避免创建过多对象的效果。

定义:

使用共享对象可有效地支持大量的细粒度对象。

2. 享元设计模式使用场景

  • 如果一个系统中存在大量的相同或者相似的对象,由于这类对象的大量使用,会造成系统内存的消耗,可以使用享元模式来减少系统中对象的数量。
  • 对象的大部分状态都可以外部化,可这些外部状态传入对象。

3. 享元设计模式UML类图

角色介绍

  • FlyWeight:享元对象抽象基类或者接口
  • ConcreteFlyweight:具体的享元对象
  • FlyweightFactory:享元工厂,负责管理享元对象池和创建享元对象

4. 享元设计模式简单实现

场景如下: 我们现在需要加载图片,如果已经加载过图片了,就直接读取本地缓存,如果没有加载过图片,从网络中保存图片,以图片地址为key。

  • (1)、首先定义一个接口:
public interface Pic {
    public void showInfo();
}

showInfo方法用来展示图片信息

  • (2)、Bitmap图片类,实现Pic接口:
public class Bitmap implements Pic {
    private String src; //图片地址

    public Bitmap(String src) {
        this.src = src;
    }

    @Override
    public void showInfo() {
        System.out.println(src);
    }
}
  • (3)、BitmapFactory。图片工厂类
public class BitmapFactory {
            private Map<String, Bitmap> imgs = new ConcurrentHashMap<String, Bitmap>();
            private Bitmap bitmap;

            public Bitmap getBitmap(String src) {
                if (imgs.get(src) == null) {
                    bitmap = new Bitmap(src);
                    imgs.put(src, bitmap);
                    System.out.println("加载网络.");
                } else {
                    bitmap = imgs.get(src);
                    System.out.println("加载本地.");
                }
                return bitmap;
            }
        }

如果本地有图片,从本地取出;如果没有图片,联网,存入本地。

  • (4)、测试类:
public class Client {
            public static void main(String[] args) {
                BitmapFactory bitmapFactory = new BitmapFactory();
                Bitmap bitMap1 = bitmapFactory.getBitmap("图片1");
                bitMap1.showInfo();
                Bitmap bitMap2 = bitmapFactory.getBitmap("图片2");
                bitMap2.showInfo();
                Bitmap bitMap1_1 = bitmapFactory.getBitmap("图片1");
                bitMap1_1.showInfo();
            }
        }

结果如下:

        加载网络.
        图片1
        加载网络.
        图片2
        加载本地.
        图片1

可以看到,第一次创建后,第三次取出同样的图片时,加载的是本地图片。

5. 享元设计模式在Android源码中

享元模式在Android源码也比较常见,比如ListView的convertView。

在getView时,判断convertView是不是null,如果等于null,才会调用inflate()方法来加载布局,不等于null就直接利用convertView。

convertView是我们之前用过的View,只不过移除了屏幕后进入了废弃的缓存中。当convertView不等于null时,将其重新拿出来使用。

6. 总结

享元模式用来尽可能减少内存使用量,它适合用于可能存在大量重复对象的场景,来缓存可共享的对象,达到对象共享、避免创建过多对象的效果。

  • 优点:

    • 大幅度降低内存中对象的数量,减少内存开销。
时间: 2024-10-08 03:34:26

二十一、享元设计模式的相关文章

Java设计模式菜鸟系列(二十一)享元模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40021651 享元模式(Flyweight):运用共享的技术有效地支持大量细粒度的对象.主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销.在某种程度上,你可以把单例看成是享元的一种特例. 一.uml建模: 二.代码实现 /** * 享元模式(Flyweight):运用共享的技术有效地支持大量细粒度的对象. * * 主要目的是实现对象的共享,即共享池,当系统中对象

设计模式(十二)享元模式(Flyweight Pattern)

一.引言 在软件开发过程,如果我们需要重复使用某个对象的时候,如果我们重复地使用new创建这个对象的话,这样我们在内存就需要多次地去申请内存空间了,这样可能会出现内存使用越来越多的情况,这样的问题是非常严重,然而享元模式可以解决这个问题,下面具体看看享元模式是如何去解决这个问题的. 二.享元模式的详细介绍 在前面说了,享元模式可以解决上面的问题了,在介绍享元模式之前,让我们先要分析下如果去解决上面那个问题,上面的问题就是重复创建了同一个对象,如果让我们去解决这个问题肯定会这样想:“既然都是同一个

设计模式第8篇:享元设计模式

一.享元设计模式要解决的问题 享元设计模式是一种结构设计模式,当我们要创建同一个类的大量对象时,可以考虑享元设计模式.由于每一个对象都会消耗内存空间,享元设计模式通过共享对象达到降低内存消耗. 二.享元设计模式的要点 1.需要创建的对象数量特别巨大. 2.对象创建占用内存大且耗时. 3.对象属性可以分为内部属性和外部属性,对象的外部属性应由客户端程序定义. 为了使用享元设计模式,我们需要将对象属性分为内部属性和外部属性,内部属性使该对象保持唯一性,外部属性由客户端程序定义并通常用来执行一些不同的

java高新技术-基本数据类型拆装箱及享元设计模式

享元设计模式 public static void main(String[] args) { Integer iObj = 3; //自动装箱 System.out.println(iObj + 12); //自动拆箱 Integer i1 = 13; Integer i2 = 13; System.out.println(i1 == i2); //true 享元设计模式(flyweight) -128~127 } 对于基本类型的整数要装箱成为Integer对象的时候,如果这个数字在1个字节之

JAVA笔记8__内部类/链表的实现/包装类、享元设计模式/包、访问修饰符

/** * 内部类:在一个类的内部中定义的类 * 1. class Outer{ * class Inner{} * } * 2. class Outer{ //方法内部类 * public void doSomething(){ * class Inner(){} * } * } * 2*:1.方法内部类只能在定义该内部类的方法中实例化 * 2.方法内部类对象不能使用该内部类所在方法的非final局部变量 * (原因:局部变量随着方法调用的结束而消失,而new出来的内部类对象的作用域是可以在方

设计模式之二十二:享元模式(FlyWeight)

享元模式: 使用共享技术有效地支持大量细粒度的对象. Use sharing to support large numbers of fine-grained objects efficiently. 这个设计模式和它的名字一样核心是为了共享代码. UML图: 主要包括: FlyWeight:声明了一个接口,通过这个接口所有的FlyWeight能够接受并作用于外部的状态. ConcreteFlyWeight:实现了FlyWeight声明的接口,并且可能会增加一些内部状态. UnSharedCon

javascript设计模式学习之十一——享元模式

一.享元模式的定义及使用场景 享元模式是一种用于性能优化的模式,如果系统中因为创建了大量类似对象而导致内存占用过高,享元模式就非常有用了.享元模式的核心是运用共享技术来有效支持大量细粒度的对象. 享元模式的关键是区分内部状态和外部状态,剥离了外部状态的对象成为共享对象,外部状态在必要时被传入共享对象来组装成一个完整的对象.那些可以被对象共享的属性通常就被划分为内部状态.

设计模式C++实现二十二:享元模式

享元模式(flyweight):运用共享技术有效地支持大量细粒度的对象. 享元模式可以避免大量非常相似类的开销.在程序设计中,有时需要生成大量细粒度的类实例来表示数据.如果能发现这些实例除了几个参数外基本上都是相同的,有时就能够受大幅度地减少需要实例化的类的数量.如果能把那些参数移到类实例的外面,在方法调用时将它们传过来,就可以通过共享大幅度地减少单个实例的数目. 使用场景:如果一个应用程序使用了大量的对象,而大量的这些对象造成了很大的存储开销时就应该考虑应用,还有就是对象的大多数状态可以外部状

设计模式(十二)—— 享元模式

模式简介 运用共享技术有效地支持大量细粒度地对象. 通常情况下,面向对象技术可以增强系统地灵活性及可扩展性,在系统开发过程中,我们会不断地增加类和对象.当对象数量过多时,将会带来系统开销过高.性能下降等问题.享元模式通过共享相同或相似的对象来解决这一类问题.在介绍享元模式之前,首先要弄清楚两个概念:内部状态(Intrinsic State)和外部状态(Extrinsic State). 内部状态是存储在享元对象内部并且不会随环境改变而改变的状态,因此内部状态可以共享.例如,围棋中的棋子,它们的形