享元模式(Flyweight Pattern)

1.享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度对象的复用。享元模式运用共享技术实现相同或相似对象的复用。
2.享元模式要求细粒度对象和对象复用,那很多对象具有相同或者相似的特征等等,我们将这些对象的信息分为两个部分:内部状态(intrinsic)与外部状态(extrinsic)。
● 内部状态
内部状态是对象可共享出来的信息,存储在享元对象内部并且不会随环境改变而改变,它们可以作为一个对象的动态附加信息,不必直接储存在具体某个对象中,属于可以共享的部分。
● 外部状态
外部状态是对象得以依赖的一个标记,是随环境改变而改变的、不可以共享的状态,它是一批对象的统一标识,是唯一的一个索引值
3.类型:对象结构型模式
4.类图
在这里插入图片描述
5.各部分说明
Flyweight:抽象享元类
声明了具体享元类公共的方法。
提供享元对象的内部数据、设置外部数据。
ConcreteFlyweight:具体享元类
继承或实现了抽象享元类。
其实例称为享元对象。
UnsharedConcreteFlyweight:非共享具体享元类
继承或实现了抽象享元类。
并不是所有的抽象享元类的子类都需要被共享,不能被共享的子类可设计为非共享具体享元类。
FlyweightFactory:享元工厂类
享元工厂类用于创建并管理享元对象。
针对抽象享元类编程,将各种类型的具体享元对象存储在一个享元池中,享元池一般设计为一个存储“键值对”的集合(也可以是其他类型的集合。当用户请求一个具体享元对象时,享元工厂提供一个存储在享元池中已创建的实例或者创建一个新的实例(如果不存在的话),返回新创建的实例并将其存储在享元池中。简单来讲,就是构造一个池容器,同时提供从池中获得对象的方法。
5.实现

package 享元模式;

import java.util.HashMap;

public class FlyweightPattern {
    public static void main(String[] args) {
        Flyweight fw = FlyweightFactory.getFlyweight("1");
        System.out.println(fw.toString());
        Flyweight fw2 = FlyweightFactory.getFlyweight("2515");
        System.out.println(fw2.toString());
        fw.operate();
    }
}

//抽象享元类
abstract class Flyweight{
    //内部状态
    private String intrinsic;
    //外部状态
    protected final String Extrinsic;
    //享元角色必须接受外部状态
    protected 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;
    }
}

//具体享元类
class ConcreteFlyweight extends Flyweight{
    //接受外部状态
    public ConcreteFlyweight(String extrinsic){
        super(extrinsic);
    }
    @Override
    public void operate() {
        System.out.println("ConcreteFlyweight.operate()");
    }
}

//享元工厂类
class FlyweightFactory{
    //定义一个池容器
    private static HashMap pool = new HashMap();
    //享元工厂
    public static Flyweight getFlyweight(String Extrinsic){
        //需要返回的对象
        Flyweight flyweight = null;
        //在池中查找
        if (pool.containsKey(Extrinsic)){
            //有,直接取出
            flyweight =(Flyweight)pool.get(Extrinsic);
        }else{
            //根据外部状态创建享元对象并放入到池中
            flyweight = new ConcreteFlyweight(Extrinsic);
            pool.put(Extrinsic,flyweight);
        }
        return flyweight;
    }
}

6.优点
享元模式可以实现对象的多次复用,在相同或相似对象较多的特殊情况下可以有效地减少内存中对象的数量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值