享元模式 — 共享重用

2020-04-02  本文已影响0人  lfeilu

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

1、定义

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

2、组成角色

image.png

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

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、代码下载

上一篇 下一篇

猜你喜欢

热点阅读