`

android 设计模式-享元模式

 
阅读更多

享元(FlyWeight)模式,原意是“轻量级”模式,它用来解决大量相同对象被多次实例化,从而导致内存被大量占用的情况。在有的时候我们要多次使用某个类中的公有实例方法,我们通常的做法是,先new一个该类的实例,然后再调用该类的这个方法,调用完毕后这个类也就变成垃圾。这种调用方式如果出现的频率很高,会在对象生成和内存占用上付出很大的代价,享元模式尽可能多地节省对象的生成次数,让多个对象共用一个缓存中的对象。
享元模式中关键要理解“内蕴状态”(Internal State)和“外蕴状态”(External State)这两个概念。
    内蕴状态:存储在享元对象内部,不随着环境改变,要以被诸多对象共享。
    外蕴状态:一般由客户端指定,并传入享元对象内部,它随着环境进行变化。
   
举例:
    1、QQ好友管理器:管理并显示每一个好友发来的消息。在聊天的过程中,与一个好友之间的通信联系只通过一个享元对象实现消息的发送与接收,而不是每次发送接收消息都生成一个新的对象。
   2、网吧管理软件:在网吧管理软件中,客户机软件向服务器软件发出请求(如:举手、上线解屏、下线锁屏......),服务器软件也会向客户机发出指令(如:远程关机,远程监视......),不管客户端与服务器端发生多少次交互,在服务器端每个客户端只保留一个对象实例,服务器与每个客户端之间通信就是通过该对象来实现的。


结构图:


抽象享元(Flyweight):为具体享元规定出需要实现的公共接口。

具体享元(ConcreteFlyweight):实现抽象享元角色所规定的接口。如果有“内蕴状态”的话,将“内蕴状态”声明为成员变量,从而使享元对象拥用固定的“内蕴状态”。

享元工厂(FlyweightFactory):负责创建和管理享元角色,保证享元对象可以被共享。当一个客户端对象调用一个享元对象的时候,享元工厂角色会检查系统中是否已经有符合要求的享元对象。如果已经有了,享元工厂就应当提供这个现有享元对象;如果系统中没有适当的享元对象,享元工厂角色就应当创建一个合适的享元对象。

客户端(Client):维护一个对所有享元对象的引用。提供与管理享元对象的“外蕴状态”。

结构图的示意代码:
    //抽象享元
    abstract class FlyWeight
    {
        //传入外蕴状态
        public abstract void Operation(string extrinsicState);
        //显示内蕴状态和外蕴状态
        public abstract void Show();
    }
    //具体享元A
    class ConcreteFlyWeightA : FlyWeight
    {
       //内蕴状态变量
        private string intrinsicState = "FlyWeightA";
        //外蕴状态变量
        private string extrinsicState ;
        public override void Operation(string extrinsicState)
        {
            this.extrinsicState = extrinsicState;
        }
        public override void Show()
        {
            Console.WriteLine(this.intrinsicState+"\t"+this.extrinsicState);
        }
    }
    //具体享元B
    class ConcreteFlyWeightB : FlyWeight
    {
        //内蕴状态变量
        private string intrinsicState = "FlyWeightB";
        //外蕴状态变量
        private string extrinsicState;
        public override void Operation(string extrinsicState)
        {
            this.extrinsicState = extrinsicState;
        }
        public override void Show()
        {
            Console.WriteLine(this.intrinsicState + "\t" + this.extrinsicState);
        }
    }
    //享元工厂,管理享元对象
    class FlyWeightFactory
    {
        //保存享元对象
        private Hashtable t = new Hashtable();
        public FlyWeightFactory()
        {
            t.Add("A", new ConcreteFlyWeightA());
            t.Add("B",new ConcreteFlyWeightB());
        }
        //根据传入的内蕴状态,构造或返回享元对象,
        public FlyWeight GetFlyWeight(string key)
        {
            if (t.ContainsKey(key))
            {
                return (FlyWeight)t[key];
            }
            return null;
        }
    }
    class Class1
    {
      
        public static void Main(string[] args)
        {
            FlyWeightFactory f = new FlyWeightFactory();
            //这里会根据传入的关键字A,返回享元对象A
            FlyWeight fw1 = f.GetFlyWeight("A");
            fw1.Operation("A's Extinsic State");
            fw1.Show();
            //这里会根据传入的关键字B,返回享元对象B
            FlyWeight fw2 = f.GetFlyWeight("B");
            fw2.Operation("B's Extinsic State");
            fw2.Show();
           //这里会根据传入的关键字A,返回享元对象A
            FlyWeight fw3 = f.GetFlyWeight("A");
            fw3.Operation("Another A's Extinsic State");
            fw3.Show();
        }
    }

 

享元模式是一种针对大量细粒度对象有效使用的一种模式。Android中的Message、Parcel和TypedArray都利用了享元模式。以Message为例,类图如下:

clip_image002
    其中Message通过next成员变量保有对下一个Message的引用,从而构成了一个Message链表。Message Pool就通过该链表的表头管理着所有闲置的Message,一个Message在使用完后可以通过recycle()方法进入Message Pool,并在需要时通过obtain静态方法从Message Pool获取。实现代码如下:
public final class Message implements Parcelable {
    ......
    // sometimes we store linked lists of these things
    /*package*/ Message next;
    private static final Object sPoolSync = new Object();
    private static Message sPool;
    private static int sPoolSize = 0;
    private static final int MAX_POOL_SIZE = 10;
    /**
     * Return a new Message instance from the global pool. Allows us to
     * avoid allocating new objects in many cases.
     */
    public static Message obtain() {
        synchronized (sPoolSync) {
            if (sPool != null) {
                Message m = sPool;
                sPool = m.next;
                m.next = null;
                sPoolSize--;
                return m;
            }
        }
        return new Message();
    }
    ......
    public void recycle() {
        synchronized (sPoolSync) {
            if (sPoolSize < MAX_POOL_SIZE) {
                clearForRecycle();
                next = sPool;
                sPool = this;
                sPoolSize++;
            }
        }
    }
    ......
    /*package*/ void clearForRecycle() {
        what = 0;
        arg1 = 0;
        arg2 = 0;
        obj = null;
        replyTo = null;
        when = 0;
        target = null;
        callback = null;
        data = null;

分享到:
评论
1 楼 onlyxing 2012-04-18  
这种模式好用吗 能讲的通俗一点吗

相关推荐

    Android设计模式(详细讲解了10个Android设计模式)

    详细讲解了组合模式、观察者模式、单例模式、模板方法模式、备忘录模式、享元模式、命令模式、工厂方法模式、适配器模式 原型模式等10个Android设计模式,和CSDN上其他讲Android设计模式的文章完全不同。讲解详细,...

    android常用设计模式

    Android 设计模式系列还包括工厂方法模式、抽象工厂模式、创建者模式、原型模式、单例模式、适配器模式、桥模式、组合模式、装饰模式、外观模式、享元模式、代理模式、解释器模式、模板方法模式、职责链模式、命令...

    Android享元模式Demo

    享元模式是一种优化资源利用、减少对象创建的设计模式,它在Android开发中也有着广泛的应用。在这个"Android享元模式Demo"中,我们将探讨如何在Android环境中实现享元模式,并通过具体的实例来理解其工作原理。 享...

    Android-23种设计模式

    在Android开发中,设计模式是提升代码质量和可维护性的重要工具。设计模式是对软件设计中常见问题的解决方案的模板,经过时间和实践的检验,能够帮助开发者有效地解决复杂性问题,提高代码的重用性和可扩展性。本...

    android设计模式

    "android设计模式"这一主题,主要涵盖了一些常见的设计原则、模式以及如何在Android环境中应用它们。《设计模式之禅》作为一本经典著作,其深入浅出的讲解方式使得读者能够轻松掌握设计模式的核心理念。 1. **设计...

    Java和Android源码设计模式 2017-03-21

    ### Java和Android源码设计模式解析 #### 前言:设计模式的重要性 设计模式是软件工程中的一个重要概念,它代表了一种最佳实践,能够帮助开发者解决常见的编程问题。掌握设计模式不仅能够提升代码的质量,还能提高...

    Android-用Kotlin实现设计模式代码

    本主题将探讨如何利用Kotlin实现常见的设计模式,这些模式对于构建可维护、可扩展和灵活的Android应用程序至关重要。 1. **单例模式(Singleton)**:在Android中,单例模式常用于创建全局唯一实例,例如网络请求管理...

    Java和Android源码设计模式

    ### Java和Android源码设计模式 #### 前言:迈向精通之路——设计模式的重要性 在软件开发领域,设计模式被视为提升代码质量和可维护性的关键工具。本文将深入探讨Java和Android开发中常用的设计模式,并结合实际...

    Android源码设计模式解析与实战

    本书专门介绍Android源代码的设计模式,共26章,主要讲解面向对象的六大原则、主流的设计模式以及MVC和MVP模式。主要内容为:优化代码的首步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则、...

    Android源码设计模式解析与实战PDF

    本书专门介绍Android源代码的设计模式,共26章,主要讲解面向对象的六大原则、主流的设计模式以及MVC和MVP模式。主要内容为:优化代码的首步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则、...

    Android 源码设计模式解析与实战

    本书专门介绍Android源代码的设计模式,主要讲解面向对象的六大原则、主流的设计模式以及MVC和MVP模式。本书的主要内容为:优化代码的第一步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则、...

    android 24种设计模式介绍与6大设计原则

    在Android开发中,设计模式和设计原则是提升代码质量、可维护性和可扩展性的重要工具。以下是关于"Android 24种设计模式介绍与6大设计原则"的详细阐述: 一、六大设计原则 1. **单一职责原则(Single ...

    《Android 源码设计模式解析与实战》

    本书专门介绍Android源代码的设计模式,共26章,主要讲解面向对象的六大原则、主流的设计模式以及MVC和MVP模式。主要内容为:优化代码的首步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则、...

    Android源码设计模式解析与实战 pdf高清版

    此外,书中可能还会涉及其他设计模式,如享元模式、命令模式等,并提供实战案例,帮助读者将理论知识转化为实践技能。 通过学习这本书,读者不仅可以掌握设计模式的精髓,还能了解到Android系统架构的深层次设计...

    Android设计模式面试专题.pdf

    "Android设计模式面试专题" Android 设计模式是一种软件设计模式,旨在帮助开发者编写更加灵活、可维护、可扩展的代码。设计模式的核心思想是将软件系统中变化的部分和不变的部分分离,实现松耦合、提高代码的可...

    Java和Android设计模式

    ### Java和Android设计模式 #### 设计模式概览 设计模式是软件开发中解决常见问题的一种标准化解决方案。在Java及Android开发中,合理运用设计模式能够显著提高代码质量,增强程序的灵活性、可扩展性和可维护性。...

    Android源码设计模式解析与实战 pdf 高清完整版

    此外,书中还可能涉及其他如职责链模式、命令模式、享元模式等设计模式在Android框架和应用开发中的实际运用。通过阅读这本书,开发者不仅能学习到设计模式的理论知识,还能了解到如何在实际项目中有效运用这些模式...

    中文版_源码设计模式解析与实战.pdf

    《中文版_源码设计模式解析与实战.pdf》是一本专为Android开发者设计的进阶书籍,它深入探讨了设计模式在实际开发中的应用,并结合Android的源码进行了详细的解析。这本书不仅涵盖了基础的设计模式概念,还通过丰富...

Global site tag (gtag.js) - Google Analytics