zoukankan      html  css  js  c++  java
  • 轻量级

    1、Schema定义

    轻量级(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、模式适用环境
    在下面情况下能够使用享Metapatterns:
    一种系统,具有大量的相同或似对象。因为大量使用这样的对象的,内存密集型事业。
    物体的状态最能具体化。国家可以通过这些外部对象。


    使用飞锤飞锤需要保持存储对象飞锤池,这需要耗费资源的,因此,它应该只被反复使用飞锤对象值你必须使用飞锤。


  • 相关阅读:
    jchdl
    jchdl
    UVa 10256 (判断两个凸包相离) The Great Divide
    UVa 11168 (凸包+点到直线距离) Airport
    LA 2572 (求可见圆盘的数量) Kanazawa
    UVa 10652 (简单凸包) Board Wrapping
    UVa 12304 (6个二维几何问题合集) 2D Geometry 110 in 1!
    UVa 10674 (求两圆公切线) Tangents
    UVa 11796 Dog Distance
    LA 3263 (平面图的欧拉定理) That Nice Euler Circuit
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4589810.html
Copyright © 2011-2022 走看看