首页 > 代码库 > 设计模式-享元模式

设计模式-享元模式

***********************************************声明******************************************************

      原创作品,出自 “晓风残月xj” 博客,欢迎转载,转载时请务必注明出处(http://blog.csdn.net/xiaofengcanyuexj)。

      由于各种原因,可能存在诸多不足,欢迎斧正!

*********************************************************************************************************

     之前在很多场合都看见设计模式的影子,一直以来,都投入主要时间在搞算法与数据结构,后来发现设计模式真的很重要。有的时候代码的可维护、可重用、可扩展确实胜过单纯的算法效率高。所以拾起大牛书籍《大话设计模式》同时参考网上诸大牛的博客,开始我的设计模式之旅。由于平时编程时用C/C++,现在由于将来工作的需要在重新自学Java,也练练Java语法。对于设计模式的重要性,在最近准备做毕业课设时体会尤为深刻:很多时候不是不会编写相关算法模块,而是总感觉自己的代码可读性、可重用性、可拓展性比较差,不利于移植。
     今天先介绍一下享元模式。

1、概念:
     享元模式(Flyweight):运用共享技术有效的支持大量细粒度的对象。

2、实现:

1)、抽象享元角色(Flyweight)

       是所有的具体享元类的基类,提供需要实现的公共接口。
2)、具体享元角色(ConcreteFlyweight)角色

       实现抽象享元角色所规定的接口。如果有内部状态的话,必须负责为内部状态提供存储空间。享元对象的内部状态必须与对象所处的周围环境无关,从而使得享元对象可以在系统内共享。有时候具体享元角色又叫做单纯具体享元角色,因为复合享元角色是由单纯具体享元角色通过复合而成的。
3)、非享元角色(UnsharableFlyweight)角色

       代表的对象是不可以共享的。
4)、享元工厂角色(FlyweightFactoiy)角色

       负责创建和管理享元角色。本角色必须保证享元对象可以被系统适当地共享。当一个客户端对象请求一个享元对象的时候,享元工厂角色需要检查系统中是否已经有一个符合要求的享元对象,如果已经有了,享元工厂角色就应当提供这个已有的享元对象;如果系统中没有一个适当的享元对象的话,享元工厂角色就应当创建一个新的合适的享元对象。
5)、客户端(Main)角色

      本角色还需要自行存储所有享元对象的外部状态。

       

3、优点:

      实现计算机资源的共享,用少量对象实例表示大量对象,防止频繁的创建对象导致效率降低。项常见的线程池、内存池技术都应享元模式的影子。

4、缺点:

    要区分内部状态和外部状态,可能导致逻辑问题。对于分布式或多线程模式下,享元模式可能带来同步问题。

5、示例代码:

import java.util.Hashtable;

/**
 * Created by xujinxj on 2014/12/8.
 */

abstract class Flyweight
{
    String m_strName;
    public Flyweight(String tName)
    {
        m_strName=tName;
    }
    public abstract void show();
}

class ConcreteFlyweight extends Flyweight
{
    public  ConcreteFlyweight(String tName)
    {
        super(tName);
    }
    public  void show()
    {
        System.out.println(super.m_strName);
    }
}

class UnShareConcreteFlyweight extends Flyweight
{
    public  UnShareConcreteFlyweight(String tName)
    {
        super(tName);
    }
    public  void show()
    {
        System.out.println(m_strName);
    }
}

class FlyweightFactory
{
    private Hashtable<String,Flyweight>m_hashSet =new Hashtable<String,Flyweight>();
    public Flyweight getFlyweight(String tName)
    {
        if(!m_hashSet.containsKey(tName))
            m_hashSet.put(tName,new ConcreteFlyweight(tName));
        System.out.println("FlyweightFactory 's size = "+m_hashSet.size());
        return m_hashSet.get(tName);
    }
}

public class Main {
    public static void main(String[]arg)
    {
        String str[]={"Xujin","Xuchao","Xujin"};
        FlyweightFactory fac=new FlyweightFactory();

        Flyweight ins=fac.getFlyweight(str[0]);
        ins.show();

        ins=fac.getFlyweight(str[1]);
        ins.show();

        ins=fac.getFlyweight(str[2]);
        ins.show();
    }
}


由于时间有限,在写博文的过程中参考过一些文献,在此表示感谢;同时鉴于水平原因,你难免有不足之处,欢迎斧正!



设计模式-享元模式