• 享元模式


    享元模式是池技术的重要实现方式,其定义如下:
    Use sharing to support large numbers of fine-grained objects efficiency.
    使用共享对象可有效的支持大量的细粒度的对象
    享元模式的定义为我们提出了两个要求:细粒度的对象和共享对象
    细粒度对象使用的数量多且性质相近,那么就需要将这些对象的信息分为两个部分:内部状态(intrinsic)和外部状态(extrinsic)
    内部状态:就是对象中可共享出来的信息,存储在享元对象内部并且不会随环境改变而改变
    外部状态:就是对象得以依赖的一个标记,是随环境改变而改变的,不可以共享的状态

    享元模式角色:
    Flyweight抽象享元角色:就是一个产品的抽象类,同事定义出对象的外部状态和内部状态的接口或实现
    ConcreteFlyweight具体享元角色:具体的一个产品类,实现抽象角色定义的业务。该角色中需要注意的是内部状态处理应该与
    环境无关,不应该出现一个操作改变了内部状态。同事修改了外部状态
    unsharedConcreteFlyweight不可共享的享元角色:不存在外部状态或安全要求(如线程安全)不能够使用共享技术的对象,该对象
    一般不会出现在享元工厂中。
    FlyweightFactory享元工厂:职责非常简单就是构造一个池容器,同时提供从池中获得对象的方法

    //抽象享元角色
    public abstract class Flyweight{
    	//内部状态
    	private String intrinsic;
    	//外部状态
    	private final String Extrinsic;  //将外部状态定义为final,是为了防止意外产生,防止无意中修改导致池混乱
    	/*
    		注意:在程序开发中,确认只需要一次赋值的属性则设置为final类型,避免无意修改导致逻辑混乱,特别是Session
    		级的常量或变量
    	*/
    	//要求享元角色必须接受外部状态
    	public Flyweight(String _extrinsic){
    		this.Extrinsic=_extrinsic;
    	}
    	//定义业务操作
    	public abstract void operate();
    	//内部状体的getter/setter
    	public String getIntrinsic(){
    		return intrinsic;
    	}
    	public void setIntrinsic(String intrinsic){
    		this.intrinsic=intrinsic;
    	}
    }
    
    //具体享元角色
    public class ConcreteFlyweight1 extends Flyweight{
    	//接受外部状态
    	public ConcreteFlyweight1(String _extrinsic){
    		super(_extrinsic);
    	}
    	//根据外部状体进行逻辑处理
    	public void operate(){
    	
    	}
    }
    public class ConcreteFlyweight2 extends Flyweight{
    	//接受外部状态
    	public ConcreteFlyweight2(String _extrinsic){
    		super(_extrinsic);
    	}
    	//根据外部状体进行逻辑处理
    	public void operate(){
    	
    	}
    }
    
    //享元工厂
    public class FlyweightFactory{
    	//定义一个池容量
    	private static HashMap<String,Flyweight> pool=new HashMap<String,Flyweight>();
    	//享元工厂
    	public static Flyweight getFlyweight(String extrinsic){
    		//需要返回的对象
    		Flyweight flyweight=null;
    		//在池中没有该对象
    		if(pool.containKey(extrinsic)){
    			flyweight=pool.get(extrinsic);
    		}else{
    			//根据外部状态创建享元对象
    			flyweight=new ConcreteFlyweight1(extrinsic);
    			//放置到池中
    			pool.put(extrinsic,flyweight);
    		}
    		return flyweight;
    	}
    }
    

      

    享元模式的优点和缺点:
    享元模式是一个非常简单的模式,它可以大大减少应用程序创建的对象,降低程序内存占用,增强程序的性能,但它同时也提高
    了系统复杂性,需要分离外部状体和内部状态,而且外部状态具有固化特性,不应该随内部状态改变而改变。否则导致系统的逻辑混乱

    使用场景:
    1.系统中存在大量的相似对象
    2.细粒度的对象都具备较接近的外部状态,而且内部状态与环境无关,也就是说对象没有特定身份
    3.需要缓冲池的场景

  • 相关阅读:
    (转)Javascript面向对象编程(二):构造函数的继承(作者:阮一峰)
    (转)Javascript 面向对象编程(一):封装(作者:阮一峰)
    asp.net的3个经典范例(ASP.NET Starter Kit ,Duwamish,NET Pet Shop)学习资料
    (转)Ajax的原理和应用
    在ASP.NET MVC应用程序中实现Server.Transfer()类似的功能
    D2GS1.11 的DC Key的相關設置指南
    Win64位操作系统无法运行暗黑2战网D2GS的解决办法
    PVPGN 暗黑破坏神2 1.11b战网配置问题汇总
    PVPGN1.8.2 + D2GS1.11(38)搭建暗黑破坏神1.11b战网(配置指南)
    FineUI Grid控件右键菜单的实现
  • 原文地址:https://www.cnblogs.com/liaojie970/p/5496082.html
Copyright © 2020-2023  润新知