美文网首页
享元模式 — 共享重用

享元模式 — 共享重用

作者: lfeilu | 来源:发表于2020-04-02 11:09 被阅读0次

最聪明的人是最不愿浪费时间的人。 ——但丁

1、定义

享元模式 (Flyweight Pattern),享元模式是以共享的模式来支持大量细粒度对象的复用。

2、组成角色

image.png

享元模式包含的角色列举如下:

  • 抽象享元角色(Flyweight):一般是一个具体的抽象类,同时定义了对象的外部状态和内部状态的接口或实现;
  • 具体享元角色(ConcreteFlyweight):具体的一个产品类,实现了抽象享元角色中定义的接口,该角色需要注意的是内部状态的处理应该与环境无关;
  • 享元工厂(FlyweightFactory):该角色指责一般比较清晰,就是一个池工厂,提供池对象和获取池中对象的方法

3、使用实例

抽象享元角色类

public abstract class ExamInfo {
    private String student;
    private String subject;
    public ExamInfo(String subject) {
        this.subject = subject;
    }
    public String getStudent() {
        return student;
    }
    public void setStudent(String student) {
        this.student = student;
    }
    public String getSubject() {
        return subject;
    }
    public void setSubject(String subject) {
        this.subject = subject;
    }
    public abstract void operate(); 
}

具体享元角色类

public class ConcreteExamInfo extends ExamInfo{
    public ConcreteExamInfo(String subject) {
        super(subject);
    }
    @Override
    public void operate() {
        System.out.println(this.getStudent()+"正在考"+this.getSubject());
    }
}

享元工厂类

public class ExamInfoFactory {
    private  static Map<String,ExamInfo> examInfoMap = new HashMap<>();
    public static ExamInfo getExamInfo(String subject){
        ExamInfo examInfo;
        if(examInfoMap.containsKey(subject)){
            System.out.println("直接从池中获取..." + subject);
            examInfo = examInfoMap.get(subject);
        }else {
            examInfo = new ConcreteExamInfo(subject);
            examInfoMap.put(subject,examInfo);
            System.out.println("建立对象,并放到池中..." + subject);
        }
        return examInfo;
    }
}

客户端类

public class Main {
    public static void main(String[] args) {
        ExamInfo examInfo = ExamInfoFactory.getExamInfo("数学");
        examInfo.setStudent("小红");
        examInfo.operate();
        examInfo = ExamInfoFactory.getExamInfo("数学");
        examInfo.setStudent("小明");
        examInfo.operate();
        examInfo = ExamInfoFactory.getExamInfo("数学");
        examInfo.setStudent("小李");
        examInfo.operate();
        examInfo = ExamInfoFactory.getExamInfo("语文");
        examInfo.setStudent("小红");
        examInfo.operate();
        examInfo = ExamInfoFactory.getExamInfo("语文");
        examInfo.setStudent("小明");
        examInfo.operate();
        examInfo = ExamInfoFactory.getExamInfo("语文");
        examInfo.setStudent("小李");
        examInfo.operate();
    }
}

测试结果打印


image.png

4、总结

image.png

5、代码下载

相关文章

  • 享元模式 — 共享重用

    最聪明的人是最不愿浪费时间的人。 ——但丁 1、定义 享元模式 (Flyweight Patt...

  • 享元模式(Flyweight Pattern)

    享元模式以共享的形式高效地支持大量细粒度对象的重用。享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能。...

  • java设计模式-享元模式(Flyweight)

    享元模式,属于结构性模式。 享元模式,享:共享,分享;元:元件,对象的意思。整体意思就是共享对象。在JVM中,能实...

  • 结构型-Flyweight

    享元模式原理与实现 享元模式(Flyweight Design Pattern) 所谓“享元”,顾名思义就是被共享...

  • 享元模式

    描述 享元模式是对象的结构模式。享元模式以共享的方式高效地支持大量的细粒度对象。 简介 享元模式采用一个共享来避免...

  • 结构型模式:12-享元模式

    带外部状态的解决方案 单纯享元模式 在单纯享元模式中,所有的具体享元类都是可以共享的,不存在非共享具体享元类。 复...

  • Java_设计模式之享元模式

    1、关于享元模式 享元模式有点类似于单例模式,都是只生成一个对象被共享使用。享元模式主要目的就是让多个对象实现共享...

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

    享元模式的原理 享元模式(Flyweight Design Pattern)所谓“享元”,顾名思义就是被共享的单元...

  • 享元模式

    swift实战-享元模式 概论:通过共享已存在的对象,减少创建对象内存开销的设计模式被称作享元模式 享元模式Fly...

  • JavaScript 设计模式(中)——9.享元模式

    9 享元模式 享元( flyweight)模式是一种用于性能优化的模式,享元模式的核心是运用共享技术来有效支持大量...

网友评论

      本文标题:享元模式 — 共享重用

      本文链接:https://www.haomeiwen.com/subject/vxitphtx.html