zoukankan      html  css  js  c++  java
  • 享元模式

    1、模式定义

    享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度对象的复用。系统仅仅使用少量的对象,而这些对象都非常相似,状态变化非常小,可以实现对象的多次复用。

    因为享元模式要求可以共享的对象必须是细粒度对象,因此它又称为轻量级模式,它是一种对象结构型模式。

    2、模式结构
    享元模式包括例如以下角色:
    Flyweight: 抽象享元类
    ConcreteFlyweight: 详细享元类
    UnsharedConcreteFlyweight: 非共享详细享元类
    FlyweightFactory: 享元工厂类
    3、模式分析
    享元模式是一个考虑系统性能的设计模式。通过使用享元模式能够节约内存空间。提高系统的性能。


    享元模式的核心在于享元工厂类,享元工厂类的作用在于提供一个用于存储享元对象的享元池,用户须要对象时,首先从享元池中获取,假设享元池中不存在,则创建一个新的享元对象返回给用户,并在享元池中保存该新增对象。 

    典型的享元工厂类代码:

    public class FlyweightFactory
    {
    	private HashMap flyweights = new HashMap();
    	
    	public Flyweight getFlyweight(String key)
    	{
    		if(flyweights.containsKey(key))
    		{
    			return (Flyweight)flyweights.get(key);
    		}
    		else
    		{
    			Flyweight fw = new ConcreteFlyweight();
    			flyweights.put(key,fw);
    			return fw;
    		}
    	}
    } 
    

    享元模式以共享的方式高效地支持大量的细粒度对象,享元对象能做到共享的关键是区分内部状态(Internal State)和外部状态(External State)。 
    (1) 内部状态是存储在享元对象内部而且不会随环境改变而改变的状态,因此内部状态能够共享。 
    (2) 外部状态是随环境改变而改变的、不能够共享的状态。享元对象的外部状态必须由client保存,并在享元对象被创建之后,在须要使用的时候再传入到享元对象内部。

    一个外部状态与还有一个外部状态之间是相互独立的。 

    典型的享元类代码:

    public class Flyweight
    {
            //内部状态作为成员属性
    	private String intrinsicState;
    	
    	public Flyweight(String intrinsicState)
    	{
    		this.intrinsicState = intrinsicState;
    	}
    	
    	public void operation(String extrinsicState)
    	{
    		......
    	}	
    }
    

    4、模式优缺点
    享元模式的长处
    享元模式的长处在于它能够极大降低内存中对象的数量,使得同样对象或相似对象在内存中仅仅保存一份。
    享元模式的外部状态相对独立,并且不会影响其内部状态,从而使得享元对象能够在不同的环境中被共享。


    享元模式的缺点
    享元模式使得系统更加复杂,须要分离出内部状态和外部状态,这使得程序的逻辑复杂化。
    为了使对象能够共享,享元模式须要将享元对象的状态外部化。而读取外部状态使得执行时间变长。


    5、模式适用环境
    在下面情况下能够使用享元模式:
    一个系统有大量同样或者相似的对象,因为这类对象的大量使用,造成内存的大量耗费。
    对象的大部分状态都能够外部化,能够将这些外部状态传入对象中。
    使用享元模式须要维护一个存储享元对象的享元池。而这须要耗费资源。因此,应当在多次反复使用享元对象时才值得使用享元模式。


  • 相关阅读:
    20080408 VS2003 中 Jscript 文件中文乱码问题
    20080330 single process memory on Windows and Windows virtual memory
    20080331 Corillian's product is a Component Container Name at least 3 component containers that ship now with the Windows Server Family
    20080330 the difference between an EXE and a DLL
    20080408 Javascript中的字符串替换replaceG
    20080501 修复Windows Update 自动更新
    20080331 How many processes can listen on a single TCPIP port
    20080329 What is a Windows Service and how does its lifecycle differ from a standard EXE
    20080407 Fire in the hole
    20080328 Adobe Launches Webbased Photoshop Express
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6858280.html
Copyright © 2011-2022 走看看