Java 设计模式系列(14) —— 享元模式

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO

联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬

学习必须往深处挖,挖的越深,基础越扎实! 

 

享元模式

享元模式的定义:
使用共享对象可以有效的支持大量的明细粒度的对象

享元模式是以共享的方式高效的支持大量的细粒度的对象,而享元模式能做到共享的关键是区分内部状态和外部状态。

  • 内部状态:内部状态是存储在享元对象内部的,可以共享的信息,并且这些信息不会随着环境的改变而改变
  • 外部状态:外部状态是对象得以依赖的标记,外部状态是随环境改变而改变且不可以共享的状态

享元模式的参与角色

  • Flyweight 抽象享元角色:该角色对享元类进行抽象,同时定义对象的外部状态和内部状态的接口或实现
  • ConcreteFlyweight 具体享元角色:该角色实现抽象享元定义定义业务,同时享元对象的内部状态必须与环境无关,从而使得享元对象可以在系统内共享。
  • FlyweightFactory 享元工厂:该角色构造一个池容器负责创建和管理享元角色,并提供从池中获得对象的方法
享元模式的简单示例

202306152220311221.png

抽象享元角色

    public abstract class Flyweight {
        private String innerState;
        protected final String extrernalState;
        public Flyweight(String externalState) {
            this.extrernalState = externalState;
        }
        
        public abstract void operation();
        
        public String getInnerState() {
            return this.getInnerState();
        }
        
        public void setInnerState(String innerState) {
            this.innerState = innerState;
        }
    }

具体享元角色

    public class ConcreteFlyweight extends Flyweight{
        public ConcreteFlyweight(String externalState) {
            super(externalState);
            // TODO Auto-generated constructor stub
        }
        @Override
        public void operation() {
            // TODO Auto-generated method stub
            
        }
    }

享元工厂

    public class FlyweightFactory {
        private static HashMap<String,Flyweight> pool = new HashMap();
        public static Flyweight getFlyweight(String external) {
            Flyweight fly = null;
            if(pool.containsKey(external)) {
                fly =  pool.get(external);
            }else {
                fly = new ConcreteFlyweight(external);
                pool.putIfAbsent(external, fly);
            }
            return fly;
        }
    }
享元模式的优缺点和使用场景

享元模式的优点:

  • 减少应用程序创建的对象
  • 降低程序的内存占用
  • 增强了程序性能

享元模式的使用场景

  • 系统中存在大量的相似对象
  • 细粒度的对象都具备接近的
  • 需要缓冲池的场景
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值