zoukankan      html  css  js  c++  java
  • 设计模式课程 设计模式精讲 13-2 享元模式coding

    1    代码演练

    1.1  代码演练1

    1    代码演练
    1.1  代码演练1

    需求:

    每周由随机部门经历做报告;

    重点关注:

    a    该案例是单例模式和享元模式共同使用

    b    外部传入的department是外部状态,如果是Manager内部定义一个属性String类型的ManagerTitile,那么无论外部传过来的部门如何变化,这个ManagerTitile不会变化,这个ManagerTitile 称之为内部状态

    uml类图:

    员工工厂类:

    package com.geely.design.pattern.structural.flyweight;
    
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * 创建员工工厂类,
     * 我第一次做的时候就忘了创建这个类
     */
    public class EmployFactory {
        //此处应用了 final修饰 引用成员变量,引用对象的内容可以修改,但是引用地址不可以修改
        private static final Map<String,Employee> EMPLOYEE_MAP = new HashMap<String,Employee>();
    
        public static Employee getManager(String department){
            String reportContent = "开始演讲报告";
    
            Employee manager = (Manager) EMPLOYEE_MAP.get(department);
            if(manager==null){
                manager = new Manager(department);
                EMPLOYEE_MAP.put(department,manager);
                System.out.println("创建部门经理"+department);
                reportContent = "开始演讲报告";
                ((Manager) manager).setReportContent(reportContent);
                System.out.println("演讲报告内容为:"+reportContent);
            }else{
                manager = EMPLOYEE_MAP.get(department);
                System.out.println("从池子里取部门经理"+department);
                reportContent = "开始演讲报告";
                ((Manager) manager).setReportContent(reportContent);
                System.out.println("演讲报告内容为:"+reportContent);
            }
            return manager;
        }
    }

    员工接口:

    package com.geely.design.pattern.structural.flyweight;
    
    /**
     * 员工接口
     *
     * 管理者和员工类实现该接口
     */
    public interface Employee  {
        /**
         * 打印报告
         */
        void report(String department);
    }

    员工类:

    package com.geely.design.pattern.structural.flyweight;
    
    import java.util.HashMap;
    import java.util.Map;
    
    public class Manager implements Employee {
    
        //该经理所在部门
       private String department;
    
        //该经理汇报内容
       private String reportContent;
    
    
        public void setReportContent(String reportContent) {
            this.reportContent = reportContent;
        }
    
        //有参构造方法,输入部门
        public Manager(String department) {
            this.department = department;
        }
    
        /**
         * 实现report方法
         *
         * 如果池子里能取到 该部门的对象,就取,否则,直接创建一个 该部门的对象,并放到从池子里
         */
        @Override
        public void report(String reportContent){
            this.reportContent = reportContent;
        }
    }

    测试类:

    package com.geely.design.pattern.structural.flyweight;
    
    public class Test {
        public static void main(String [] args){
            String [] departmentArray = {"业务部","研发部","管理部"};
            String department = "";
            for (int i = 0;i < 10;i++){
                int departmentNum = (int)(Math.random()*departmentArray.length);
                department =departmentArray[departmentNum];
                Employee manager = EmployFactory.getManager(department);
                manager.report(department);
            }
        }
    }

    打印日志:

    "C:Program FilesJavajdk1.7.0_79injava.exe" "-javaagent:D:javadevolopKitideaanZhIntelliJ IDEA Community Edition 2018.1.4libidea_rt.jar=62707:D:javadevolopKitideaanZhIntelliJ IDEA Community Edition 2018.1.4in" -Dfile.encoding=UTF-8 -classpath "C:Program FilesJavajdk1.7.0_79jrelibcharsets.jar;C:Program FilesJavajdk1.7.0_79jrelibdeploy.jar;C:Program FilesJavajdk1.7.0_79jrelibextaccess-bridge-64.jar;C:Program FilesJavajdk1.7.0_79jrelibextdnsns.jar;C:Program FilesJavajdk1.7.0_79jrelibextjaccess.jar;C:Program FilesJavajdk1.7.0_79jrelibextlocaledata.jar;C:Program FilesJavajdk1.7.0_79jrelibextsunec.jar;C:Program FilesJavajdk1.7.0_79jrelibextsunjce_provider.jar;C:Program FilesJavajdk1.7.0_79jrelibextsunmscapi.jar;C:Program FilesJavajdk1.7.0_79jrelibextzipfs.jar;C:Program FilesJavajdk1.7.0_79jrelibjavaws.jar;C:Program FilesJavajdk1.7.0_79jrelibjce.jar;C:Program FilesJavajdk1.7.0_79jrelibjfr.jar;C:Program FilesJavajdk1.7.0_79jrelibjfxrt.jar;C:Program FilesJavajdk1.7.0_79jrelibjsse.jar;C:Program FilesJavajdk1.7.0_79jrelibmanagement-agent.jar;C:Program FilesJavajdk1.7.0_79jrelibplugin.jar;C:Program FilesJavajdk1.7.0_79jrelib
    esources.jar;C:Program FilesJavajdk1.7.0_79jrelib
    t.jar;F:xiangmu3XinIdeadesign_pattern	argetclasses;F:xiangmu3XinFuQiangmavencode
    epoorgapache	omcat	omcat-servlet-api7.0.64	omcat-servlet-api-7.0.64.jar;F:xiangmu3XinFuQiangmavencode
    epoorgspringframeworksessionspring-session-core2.1.7.RELEASEspring-session-core-2.1.7.RELEASE.jar;F:xiangmu3XinFuQiangmavencode
    epoorgspringframeworkspring-webmvc4.0.3.RELEASEspring-webmvc-4.0.3.RELEASE.jar;F:xiangmu3XinFuQiangmavencode
    epoorgspringframeworkspring-beans4.0.3.RELEASEspring-beans-4.0.3.RELEASE.jar;F:xiangmu3XinFuQiangmavencode
    epoorgspringframeworkspring-context4.0.3.RELEASEspring-context-4.0.3.RELEASE.jar;F:xiangmu3XinFuQiangmavencode
    epoorgspringframeworkspring-aop4.0.3.RELEASEspring-aop-4.0.3.RELEASE.jar;F:xiangmu3XinFuQiangmavencode
    epoaopallianceaopalliance1.0aopalliance-1.0.jar;F:xiangmu3XinFuQiangmavencode
    epoorgspringframeworkspring-core4.0.3.RELEASEspring-core-4.0.3.RELEASE.jar;F:xiangmu3XinFuQiangmavencode
    epoorgspringframeworkspring-expression4.0.3.RELEASEspring-expression-4.0.3.RELEASE.jar;F:xiangmu3XinFuQiangmavencode
    epoorgspringframeworkspring-web4.0.3.RELEASEspring-web-4.0.3.RELEASE.jar;F:xiangmu3XinFuQiangmavencode
    epoorgspringframeworkspring-oxm4.0.3.RELEASEspring-oxm-4.0.3.RELEASE.jar;F:xiangmu3XinFuQiangmavencode
    epoorgspringframeworkspring-jdbc4.0.3.RELEASEspring-jdbc-4.0.3.RELEASE.jar;F:xiangmu3XinFuQiangmavencode
    epoorgspringframeworkspring-tx4.0.3.RELEASEspring-tx-4.0.3.RELEASE.jar;F:xiangmu3XinFuQiangmavencode
    epoorgspringframeworkspring-test4.0.3.RELEASEspring-test-4.0.3.RELEASE.jar;F:xiangmu3XinFuQiangmavencode
    epoorgaspectjaspectjweaver1.7.3aspectjweaver-1.7.3.jar;F:xiangmu3XinFuQiangmavencode
    epoorgmybatismybatis-spring1.3.0mybatis-spring-1.3.0.jar;F:xiangmu3XinFuQiangmavencode
    epoorgmybatismybatis3.4.1mybatis-3.4.1.jar;F:xiangmu3XinFuQiangmavencode
    epoorgaspectjaspectjrt1.6.11aspectjrt-1.6.11.jar;F:xiangmu3XinFuQiangmavencode
    epoorgcodehausjacksonjackson-mapper-asl1.9.12jackson-mapper-asl-1.9.12.jar;F:xiangmu3XinFuQiangmavencode
    epoorgcodehausjacksonjackson-core-asl1.9.12jackson-core-asl-1.9.12.jar;F:xiangmu3XinFuQiangmavencode
    epocommons-dbcpcommons-dbcp1.4commons-dbcp-1.4.jar;F:xiangmu3XinFuQiangmavencode
    epocommons-poolcommons-pool1.5.4commons-pool-1.5.4.jar;F:xiangmu3XinFuQiangmavencode
    epochqoslogbacklogback-classic1.1.2logback-classic-1.1.2.jar;F:xiangmu3XinFuQiangmavencode
    epoorgslf4jslf4j-api1.7.6slf4j-api-1.7.6.jar;F:xiangmu3XinFuQiangmavencode
    epochqoslogbacklogback-core1.1.2logback-core-1.1.2.jar;F:xiangmu3XinFuQiangmavencode
    epomysqlmysql-connector-java5.1.6mysql-connector-java-5.1.6.jar;F:xiangmu3XinFuQiangmavencode
    epocomgoogleguavaguava20.0guava-20.0.jar;F:xiangmu3XinFuQiangmavencode
    epoorgapachecommonscommons-lang33.5commons-lang3-3.5.jar;F:xiangmu3XinFuQiangmavencode
    epocommons-collectionscommons-collections3.2.1commons-collections-3.2.1.jar;F:xiangmu3XinFuQiangmavencode
    epojunitjunit4.12junit-4.12.jar;F:xiangmu3XinFuQiangmavencode
    epojoda-timejoda-time2.3joda-time-2.3.jar;F:xiangmu3XinFuQiangmavencode
    epoorghashidshashids1.0.1hashids-1.0.1.jar;F:xiangmu3XinFuQiangmavencode
    epocommons-netcommons-net3.1commons-net-3.1.jar;F:xiangmu3XinFuQiangmavencode
    epocommons-fileuploadcommons-fileupload1.2.2commons-fileupload-1.2.2.jar;F:xiangmu3XinFuQiangmavencode
    epocommons-iocommons-io2.0.1commons-io-2.0.1.jar;F:xiangmu3XinFuQiangmavencode
    epocomgithubpagehelperpagehelper4.1.0pagehelper-4.1.0.jar;F:xiangmu3XinFuQiangmavencode
    epocomgithubmiemiedevmybatis-paginator1.2.17mybatis-paginator-1.2.17.jar;F:xiangmu3XinFuQiangmavencode
    epocomgithubjsqlparserjsqlparser.9.4jsqlparser-0.9.4.jar;F:xiangmu3XinFuQiangmavencode
    epocommons-codeccommons-codec1.10commons-codec-1.10.jar;F:xiangmu3XinFuQiangmavencode
    epocommons-configurationcommons-configuration1.10commons-configuration-1.10.jar;F:xiangmu3XinFuQiangmavencode
    epocommons-langcommons-lang2.6commons-lang-2.6.jar;F:xiangmu3XinFuQiangmavencode
    epocommons-loggingcommons-logging1.1.1commons-logging-1.1.1.jar;F:xiangmu3XinFuQiangmavencode
    epocomgooglezxingcore2.1core-2.1.jar;F:xiangmu3XinFuQiangmavencode
    epocomgooglecodegsongson2.3.1gson-2.3.1.jar;F:xiangmu3XinFuQiangmavencode
    epoorghamcresthamcrest-core1.3hamcrest-core-1.3.jar;F:xiangmu3XinFuQiangmavencode
    epo
    edisclientsjedis2.6.0jedis-2.6.0.jar;F:xiangmu3XinFuQiangmavencode
    epoorgapachecommonscommons-pool22.0commons-pool2-2.0.jar;F:xiangmu3XinFuQiangmavencode
    epoorgprojectlomboklombok1.16.18lombok-1.16.18.jar;F:xiangmu3XinFuQiangmavencode
    epoorg
    edisson
    edisson2.9.0
    edisson-2.9.0.jar;F:xiangmu3XinFuQiangmavencode
    epoio
    etty
    etty-common4.1.8.Final
    etty-common-4.1.8.Final.jar;F:xiangmu3XinFuQiangmavencode
    epoio
    etty
    etty-codec4.1.8.Final
    etty-codec-4.1.8.Final.jar;F:xiangmu3XinFuQiangmavencode
    epoio
    etty
    etty-buffer4.1.8.Final
    etty-buffer-4.1.8.Final.jar;F:xiangmu3XinFuQiangmavencode
    epoio
    etty
    etty-transport4.1.8.Final
    etty-transport-4.1.8.Final.jar;F:xiangmu3XinFuQiangmavencode
    epoio
    etty
    etty-resolver4.1.8.Final
    etty-resolver-4.1.8.Final.jar;F:xiangmu3XinFuQiangmavencode
    epoio
    etty
    etty-handler4.1.8.Final
    etty-handler-4.1.8.Final.jar;F:xiangmu3XinFuQiangmavencode
    epojavaxcachecache-api1.0.0cache-api-1.0.0.jar;F:xiangmu3XinFuQiangmavencode
    epoioprojectreactor
    eactor-stream2.0.8.RELEASE
    eactor-stream-2.0.8.RELEASE.jar;F:xiangmu3XinFuQiangmavencode
    epoioprojectreactor
    eactor-core2.0.8.RELEASE
    eactor-core-2.0.8.RELEASE.jar;F:xiangmu3XinFuQiangmavencode
    epoorg
    eactivestreams
    eactive-streams1.0.0
    eactive-streams-1.0.0.jar;F:xiangmu3XinFuQiangmavencode
    epocomfasterxmljacksondataformatjackson-dataformat-yaml2.6.7jackson-dataformat-yaml-2.6.7.jar;F:xiangmu3XinFuQiangmavencode
    epoorgyamlsnakeyaml1.15snakeyaml-1.15.jar;F:xiangmu3XinFuQiangmavencode
    epocomfasterxmljacksoncorejackson-core2.6.7jackson-core-2.6.7.jar;F:xiangmu3XinFuQiangmavencode
    epocomfasterxmljacksoncorejackson-databind2.6.7jackson-databind-2.6.7.jar;F:xiangmu3XinFuQiangmavencode
    epocomfasterxmljacksondataformatjackson-dataformat-avro2.9.0jackson-dataformat-avro-2.9.0.jar;F:xiangmu3XinFuQiangmavencode
    epocomfasterxmljacksoncorejackson-annotations2.9.0jackson-annotations-2.9.0.jar;F:xiangmu3XinFuQiangmavencode
    epoorgapacheavroavro1.8.1avro-1.8.1.jar;F:xiangmu3XinFuQiangmavencode
    epocom	houghtworksparanamerparanamer2.7paranamer-2.7.jar;F:xiangmu3XinFuQiangmavencode
    epoorgxerialsnappysnappy-java1.1.1.3snappy-java-1.1.1.3.jar;F:xiangmu3XinFuQiangmavencode
    epoorgapachecommonscommons-compress1.8.1commons-compress-1.8.1.jar;F:xiangmu3XinFuQiangmavencode
    epoorg	ukaanixz1.5xz-1.5.jar;F:xiangmu3XinFuQiangmavencode
    epocomsunfacesjsf-api1.2jsf-api-1.2.jar" com.geely.design.pattern.structural.flyweight.Test
    创建部门经理业务部
    演讲报告内容为:开始演讲报告
    创建部门经理管理部
    演讲报告内容为:开始演讲报告
    从池子里取部门经理业务部
    演讲报告内容为:开始演讲报告
    从池子里取部门经理管理部
    演讲报告内容为:开始演讲报告
    从池子里取部门经理管理部
    演讲报告内容为:开始演讲报告
    创建部门经理研发部
    演讲报告内容为:开始演讲报告
    从池子里取部门经理研发部
    演讲报告内容为:开始演讲报告
    从池子里取部门经理管理部
    演讲报告内容为:开始演讲报告
    从池子里取部门经理研发部
    演讲报告内容为:开始演讲报告
    从池子里取部门经理管理部
    演讲报告内容为:开始演讲报告
    
    Process finished with exit code 0
  • 相关阅读:
    WIN10 UBUNTU 异常:sleep: cannot read realtime clock: Invalid argument
    Mysql表名大小写忽略
    Spring boot自定义配置文件并映射到指定类中
    list addAll产生异常java.lang.UnsupportedOperationException
    Oracle extract函数提取时分秒的问题
    JOOQ默认schema
    Druid数据库连接失败,无限尝试问题
    Mysql安装后root无法登陆(Access denied for user 'root'@'localhost')
    JavaSE第17篇:集合之Map集合
    JavaSE第16篇:集合之Collection集合下篇
  • 原文地址:https://www.cnblogs.com/1446358788-qq/p/11518773.html
Copyright © 2011-2022 走看看