设计模式课程 设计模式精讲 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
原文地址:https://www.cnblogs.com/1446358788-qq/p/11518773.html