zoukankan      html  css  js  c++  java
  • 设计模式-享元模式(Flyweight)

    享元模式是构造型模式之一,它通过与其他类似对象共享数据来减少内存占用

    角色和职责:

    1.抽象享元角色()-Person:

      享元角色的公共接口

    2.具体享元角色()-Teacher:

        抽象享元角色的具体实现类

    3.享元工厂角色()-TeacherFactory:

        负责创建和管理享元角色

    UML图:

    具体代码如下:

    /**
     * 一个人
     */
    public class Person {
        private String name;//姓名
        private int age;//年龄
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    }
    /**
     * 老师
     */
    public class Teacher extends Person{
        private String number;//工号
    
        public Teacher(String number){
            this.number = number;
        }
    
        public String getNumber() {
            return number;
        }
    
        public void setNumber(String number) {
            this.number = number;
        }
    }
    /**
     *   负责创建和管理享元角色
     */
    public class TeacherFactory {
        private Map<String,Teacher> map= null;//享元数据的存放点
    
        public TeacherFactory(){
            this.map = new HashMap<String,Teacher>();
        }
    
        /**
         * 返回老师
         * @return
         */
        public Teacher getTeacher(String number){
            Teacher teacher = map.get(number);
            if(teacher == null){
                teacher = new Teacher(number);
                map.put(number,teacher);
            }
            return teacher;
        }
    }
    public class Main {
        public static void main(String[] args) {
            TeacherFactory factory = new TeacherFactory();//创建老师生产类
            Teacher teacher001 = factory.getTeacher("0001");//
            Teacher teacher002 = factory.getTeacher("0002");
            Teacher teacher = factory.getTeacher("0001");
            Teacher teacher004 = factory.getTeacher("0004");
    
            System.out.println(teacher001.getNumber());
            System.out.println(teacher002.getNumber());
            System.out.println(teacher.getNumber());
            System.out.println(teacher004.getNumber());
    
            if(teacher001 == teacher){//查看两次对象是否相同
                System.out.println(true);
            }else{
                System.out.println(teacher001);
                System.out.println(teacher);
                System.out.println(false);
            }
        }
    }

    应用场景:

    • 在 JDK 的设计里,也有很享元模式,如一些常量池的设计(String 常量池、Integer 常量池等等)
    • 如果一个系统中存在大量的相同或者相似的对象,由于这类对象的大量使用,会造成系统内存的耗费,可以使用享元模式来减少系统中对象的数量。

    源码地址:https://github.com/qjm201000/design_pattern_flyweight.git

  • 相关阅读:
    从Python编程小白到大神?你可能还差这几步!
    网红游戏主播靠几行代码轻松“吃鸡”年赚百万!竟然是依靠Python
    爬虫凶猛:爬支付宝、爬微信、窃取数据/编程实战(2):爬虫架构
    轻松入门学网络爬虫编程实战(1):音乐歌单篇
    Centos System Info
    iOS xcodebuild 打包app
    Xcode部分插件无法使用识别的问题
    ios get airplay name
    Re-enable Alcatraz on Xcode 6.3.2 or newer
    Apple LLVM 6.0 Warning: profile data may be out of date
  • 原文地址:https://www.cnblogs.com/qjm201000/p/10065314.html
Copyright © 2011-2022 走看看