设计模式课程 设计模式精讲 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 Files\Java\jdk1.7.0_79\bin\java.exe" "-javaagent:D:\java\devolopKit\idea\anZh\IntelliJ IDEA Community Edition 2018.1.4\lib\idea_rt.jar=62707:D:\java\devolopKit\idea\anZh\IntelliJ IDEA Community Edition 2018.1.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.7.0_79\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\jce.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\jfxrt.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\resources.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\rt.jar;F:\xiangmu3\Xin\Idea\design_pattern\target\classes;F:\xiangmu3\Xin\FuQiang\maven\code\repo\org\apache\tomcat\tomcat-servlet-api\7.0.64\tomcat-servlet-api-7.0.64.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\org\springframework\session\spring-session-core\2.1.7.RELEASE\spring-session-core-2.1.7.RELEASE.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\org\springframework\spring-webmvc\4.0.3.RELEASE\spring-webmvc-4.0.3.RELEASE.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\org\springframework\spring-beans\4.0.3.RELEASE\spring-beans-4.0.3.RELEASE.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\org\springframework\spring-context\4.0.3.RELEASE\spring-context-4.0.3.RELEASE.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\org\springframework\spring-aop\4.0.3.RELEASE\spring-aop-4.0.3.RELEASE.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\aopalliance\aopalliance\1.0\aopalliance-1.0.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\org\springframework\spring-core\4.0.3.RELEASE\spring-core-4.0.3.RELEASE.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\org\springframework\spring-expression\4.0.3.RELEASE\spring-expression-4.0.3.RELEASE.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\org\springframework\spring-web\4.0.3.RELEASE\spring-web-4.0.3.RELEASE.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\org\springframework\spring-oxm\4.0.3.RELEASE\spring-oxm-4.0.3.RELEASE.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\org\springframework\spring-jdbc\4.0.3.RELEASE\spring-jdbc-4.0.3.RELEASE.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\org\springframework\spring-tx\4.0.3.RELEASE\spring-tx-4.0.3.RELEASE.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\org\springframework\spring-test\4.0.3.RELEASE\spring-test-4.0.3.RELEASE.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\org\aspectj\aspectjweaver\1.7.3\aspectjweaver-1.7.3.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\org\mybatis\mybatis-spring\1.3.0\mybatis-spring-1.3.0.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\org\mybatis\mybatis\3.4.1\mybatis-3.4.1.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\org\aspectj\aspectjrt\1.6.11\aspectjrt-1.6.11.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\org\codehaus\jackson\jackson-mapper-asl\1.9.12\jackson-mapper-asl-1.9.12.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\org\codehaus\jackson\jackson-core-asl\1.9.12\jackson-core-asl-1.9.12.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\commons-dbcp\commons-dbcp\1.4\commons-dbcp-1.4.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\commons-pool\commons-pool\1.5.4\commons-pool-1.5.4.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\ch\qos\logback\logback-classic\1.1.2\logback-classic-1.1.2.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\org\slf4j\slf4j-api\1.7.6\slf4j-api-1.7.6.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\ch\qos\logback\logback-core\1.1.2\logback-core-1.1.2.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\mysql\mysql-connector-java\5.1.6\mysql-connector-java-5.1.6.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\com\google\guava\guava\20.0\guava-20.0.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\org\apache\commons\commons-lang3\3.5\commons-lang3-3.5.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\commons-collections\commons-collections\3.2.1\commons-collections-3.2.1.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\junit\junit\4.12\junit-4.12.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\joda-time\joda-time\2.3\joda-time-2.3.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\org\hashids\hashids\1.0.1\hashids-1.0.1.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\commons-net\commons-net\3.1\commons-net-3.1.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\commons-fileupload\commons-fileupload\1.2.2\commons-fileupload-1.2.2.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\commons-io\commons-io\2.0.1\commons-io-2.0.1.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\com\github\pagehelper\pagehelper\4.1.0\pagehelper-4.1.0.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\com\github\miemiedev\mybatis-paginator\1.2.17\mybatis-paginator-1.2.17.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\com\github\jsqlparser\jsqlparser\0.9.4\jsqlparser-0.9.4.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\commons-codec\commons-codec\1.10\commons-codec-1.10.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\commons-configuration\commons-configuration\1.10\commons-configuration-1.10.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\commons-lang\commons-lang\2.6\commons-lang-2.6.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\commons-logging\commons-logging\1.1.1\commons-logging-1.1.1.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\com\google\zxing\core\2.1\core-2.1.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\com\google\code\gson\gson\2.3.1\gson-2.3.1.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\redis\clients\jedis\2.6.0\jedis-2.6.0.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\org\apache\commons\commons-pool2\2.0\commons-pool2-2.0.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\org\projectlombok\lombok\1.16.18\lombok-1.16.18.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\org\redisson\redisson\2.9.0\redisson-2.9.0.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\io\netty\netty-common\4.1.8.Final\netty-common-4.1.8.Final.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\io\netty\netty-codec\4.1.8.Final\netty-codec-4.1.8.Final.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\io\netty\netty-buffer\4.1.8.Final\netty-buffer-4.1.8.Final.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\io\netty\netty-transport\4.1.8.Final\netty-transport-4.1.8.Final.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\io\netty\netty-resolver\4.1.8.Final\netty-resolver-4.1.8.Final.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\io\netty\netty-handler\4.1.8.Final\netty-handler-4.1.8.Final.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\javax\cache\cache-api\1.0.0\cache-api-1.0.0.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\io\projectreactor\reactor-stream\2.0.8.RELEASE\reactor-stream-2.0.8.RELEASE.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\io\projectreactor\reactor-core\2.0.8.RELEASE\reactor-core-2.0.8.RELEASE.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\org\reactivestreams\reactive-streams\1.0.0\reactive-streams-1.0.0.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\com\fasterxml\jackson\dataformat\jackson-dataformat-yaml\2.6.7\jackson-dataformat-yaml-2.6.7.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\org\yaml\snakeyaml\1.15\snakeyaml-1.15.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\com\fasterxml\jackson\core\jackson-core\2.6.7\jackson-core-2.6.7.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\com\fasterxml\jackson\core\jackson-databind\2.6.7\jackson-databind-2.6.7.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\com\fasterxml\jackson\dataformat\jackson-dataformat-avro\2.9.0\jackson-dataformat-avro-2.9.0.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\com\fasterxml\jackson\core\jackson-annotations\2.9.0\jackson-annotations-2.9.0.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\org\apache\avro\avro\1.8.1\avro-1.8.1.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\com\thoughtworks\paranamer\paranamer\2.7\paranamer-2.7.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\org\xerial\snappy\snappy-java\1.1.1.3\snappy-java-1.1.1.3.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\org\apache\commons\commons-compress\1.8.1\commons-compress-1.8.1.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\org\tukaani\xz\1.5\xz-1.5.jar;F:\xiangmu3\Xin\FuQiang\maven\code\repo\com\sun\faces\jsf-api\1.2\jsf-api-1.2.jar" com.geely.design.pattern.structural.flyweight.Test
创建部门经理业务部
演讲报告内容为:开始演讲报告
创建部门经理管理部
演讲报告内容为:开始演讲报告
从池子里取部门经理业务部
演讲报告内容为:开始演讲报告
从池子里取部门经理管理部
演讲报告内容为:开始演讲报告
从池子里取部门经理管理部
演讲报告内容为:开始演讲报告
创建部门经理研发部
演讲报告内容为:开始演讲报告
从池子里取部门经理研发部
演讲报告内容为:开始演讲报告
从池子里取部门经理管理部
演讲报告内容为:开始演讲报告
从池子里取部门经理研发部
演讲报告内容为:开始演讲报告
从池子里取部门经理管理部
演讲报告内容为:开始演讲报告 Process finished with exit code 0
设计模式课程 设计模式精讲 13-2 享元模式coding的更多相关文章
- C#设计模式(13)——享元模式
1.享元模式介绍 在软件开发中我们经常遇到多次使用相似或者相同对象的情况,如果每次使用这个对象都去new一个新的实例会很浪费资源.这时候很多人会想到前边介绍过的一个设计模式:原型模式,原型模式通过拷贝 ...
- 设计模式(十二): Flyweight享元模式 -- 结构型模式
说明: 相对于其它模式,Flyweight模式在PHP实现似乎没有太大的意义,因为PHP的生命周期就在一个请求,请求执行完了,php占用的资源都被释放.我们只是为了学习而简单做了介绍. 1. 概述 面 ...
- 【13】享元模式(FlyWeight Pattern)
一.引言 在软件开发过程,如果我们需要重复使用某个对象的时候,若重复地使用new创建这个对象的话,就需要多次地去申请内存空间了,这样可能会出现内存使用越来越多的情况,这样的问题是非常严重.享元模式可以 ...
- 【设计模式】享元模式(Flyweight)
摘要: 1.本文将详细介绍享元模式的原理和实际代码中特别是Android系统代码中的应用. 纲要: 1. 引入享元模式 2. 享元模式的概念及优缺点介绍 3. 享元模式在Android源码中的应用 1 ...
- .NET设计模式(13):享元模式(Flyweight Pattern)(转)
摘要:面向对象的思想很好地解决了抽象性的问题,一般也不会出现性能上的问题.但是在某些情况下,对象的数量可能会太多,从而导致了运行时的代价.那么我们如何去避免大量细粒度的对象,同时又不影响客户程序使用面 ...
- 设计模式之享元模式(Flyweight)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- Java设计模式-享元模式(Flyweight)
享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用. FlyWeightFactory负责创建和管理享元单元,当一个客户端请求时,工厂需要检查 ...
- 8. 星际争霸之php设计模式--享元模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- js设计模式(8)---享元模式
0.前言 今天总结了四种设计模式,到现在有点精疲力尽了,但是还是有不少收获,很开心自己有掌握了新的东西,今天变得有了价值. 1.使用条件 1.1.网页中使用了大量资源密集型的对象: 1.2.这些对象中 ...
随机推荐
- buuctf admin writeup
熟悉的登陆注册页面,结合结合题目admin的提示,想到是通过修改admin用户密码或伪造admin身份的方式来以admin账户.查看源码,看到了一个hint: 下载下来,是靶场的源码首先尝试抓包分析, ...
- Python学习(三)——Python的运算符和数值、字符的类中方法
Python开发IDE PyCharm,eclipse PyCharm的基础用法 全部选中后 Ctrl+?全部变为注释 运算符 结果为值的运算符 算术运算符: + - * / % // ** 赋值运算 ...
- IIS-反向代理配置&&插件安装
参考:https://www.cnblogs.com/pengcc/p/4329207.html 网络上好多开场的文章就说了好多的原理之类的这里我们直接开始配置.不过也要简单说下win下配置反向代理只 ...
- python 爬取图片
使用python的requests库爬取网页时,获取文本一般使用text方法,如果要获取图片并保存要用content 举个栗子,爬煎蛋网的图: #!/usr/bin/env python #-*- c ...
- ICCV2019 oral:Wavelet Domain Style Transfer for an Effective Perception-distortion Tradeoff in Single Image Super-Resolution
引言 基于低分辨率的图像恢复高分辨图像具有重要意义,近年来,利用深度学习做单张图像超分辨主要有两个大方向:1.减小失真度(distortion, 意味着高PSNR)的图像超分辨,这类方法主要最小化均方 ...
- Mysql常用的sql语句
替换某字段的字符串: UPDATE article SET content = replace(content, '解决', '解放') WHERE ID<5000; 清空数据库,id也置空: ...
- CSS水平垂直居中常见方法总结
1.元素水平居中 当然最好使的是: margin: 0 auto; 居中不好使的原因: 1.元素没有设置宽度,没有宽度怎么居中嘛! 2.设置了宽度依然不好使,你设置的是行内元素吧,行内元素和块元素的区 ...
- 27 JavaScript的引入&注释&弹窗&变量常量&数据类型及转换&内存&垃圾回收
JS的引入: 1 内部引入 绑定元素事件如onclick="" 绑定锚点如href="JavaScript:void(0)" script标签引入,注意:如果标 ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 网格系统实例:堆叠的水平
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 【JS 移动端】获取设置页面大小
获取设置页面大小 function getMobileData() { var ismobile = false; browser = { versions: function () { var u ...