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

享元模式 — 共享重用

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

    相关文章

      网友评论

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

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