• 设计模式之享元模式(结构型)


    模式定义

    享元模式(Flyweight Pattern)就是通过共享技术实现大量细粒度对象的复用。享元模式是通过细粒度对象的共享,所以也可以说享元模式是一种轻量级模式。按照Gof模式分类,享元模式属于对象结构型模式。

    模式解释

    • 可以共享的内容称为内部状态(Intrinsic State),需要外部环境设置的不能共享的内容称为外部状态(Extrinsic State)。享元模式需要创建一个享元工厂负责维护享元池(Flyweight Pool),享元池用于存储具有相同内部状态的享元对象。

    • 享元模式中共享的仅仅是享元对象,外部状态是需要通过环境类设置的,在实际使用中,能共享的内部状态不是很多的,所以设计享元对象是比较小的,也就是细粒度对象,所以说享元模式就是通过共享技术实现大量细粒度对象的复用

    • 创建大量对象会一定程度影响系统性能,不方便程序阅读,使用享元模式可以减少对象使用。

    模式角色

    享元模式包括下面角色

    • Flyweight:抽象享元类

    • ConcreteFlyweight:具体享元类

    • UnsharedConcreteFlyweight:非分享具体享元类

    • FlyweightFactory:享元工厂类

    享元模式的核心在享元工厂类,享元工厂类的作用在与维护享元池,需要什么对象,可以从享元池获取

    典型例子

    例子来自:《设计模式》一书

    public class Flyweight
    {
            //内部状态作为成员属性
    	private String intrinsicState;
    	
    	public Flyweight(String intrinsicState)
    	{
    		this.intrinsicState = intrinsicState;
    	}
    	
    	public void operation(String extrinsicState)
    	{
    		......
    	}	
    }
    
    
    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;
    		}
    	}
    } 
    
    

    模式应用

    • JDK类库中的String类使用了享元模式
      ...

    模式分类

    享元模式分为单存享元模式和复合享元模式

    • 单纯享元模式:在单纯享元模式中不存在非共享具体单元,所有的具体享元类对象都是可以共享的。
    • 复合享元模式:通过复合模式将单纯享元模式进行组合,形成复合享元对象
  • 相关阅读:
    .NetCore Grpc 客服端 工厂模式配置授权
    DOCKER 拉取 dotnet 镜像太慢 docker pull mcr.microsoft.com too slow
    Introducing .NET 5
    VSCode 出现错误 System.IO.IOException: The configured user limit (128) on the number of inotify instances has been reached.
    Omnisharp VsCode Attaching to remote processes
    zookeeper3.5.5 centos7 完全分布式 搭建随记
    Hadoop2.7.7 centos7 完全分布式 配置与问题随记
    MySQL索引 索引分类 最左前缀原则 覆盖索引 索引下推 联合索引顺序
    SQL基础随记3 范式 键
    MySQL调优 优化需要考虑哪些方面
  • 原文地址:https://www.cnblogs.com/mzq123/p/10224681.html
Copyright © 2020-2023  润新知