当前位置: 首页 > news >正文

有没有教做蛋糕的网站推广普通话手抄报简单

有没有教做蛋糕的网站,推广普通话手抄报简单,做网站比较专业的有哪些公司,《水利建设与管理》杂志社网站设计模式—创建型模式之原型模式 原型模式(Prototype Pattern)用于创建重复的对象,同时又能保证性能。 本体给外部提供一个克隆体进行使用。 比如我们做一个SjdwzMybatis,用来操作数据库,从数据库里面查出很多记录&…

设计模式—创建型模式之原型模式

原型模式(Prototype Pattern)用于创建重复的对象,同时又能保证性能。

本体给外部提供一个克隆体进行使用。

比如我们做一个SjdwzMybatis,用来操作数据库,从数据库里面查出很多记录,其中很多记录改变很少。每次查数据库,把所有数据都封装一个对象,然后返回。假设有很多线程,来查如下记录:

Student student = new Student("张三","男")

如果每次都创建对象封装并返回,这样系统就会有很多student;这样就会浪费内存。

Student类如下:

public class Student {private String name;private Integer age;public Student() {System.out.println("创建了Student对象");}//省略getter() 、 setter() toString()
}

SjdwzMybatis如下:

public class SjdwzMybatis {/*** 通过name获取Student*/public Student queryStudent(String name){return queryStudentFromDB(name);}/*** 演示从数据库查Student*/private Student queryStudentFromDB(String name) {//简单演示,查询到了System.out.println("从数据库查询到了:"+name);Student student = new Student();student.setName(name);student.setAge(16);return student;}
}

测试类:

public class ProtoTypeTest {public static void main(String[] args) {SjdwzMybatis sjdwzMybatis = new SjdwzMybatis();Student stu1 = sjdwzMybatis.queryStudent("zhangsan");Student stu2 = sjdwzMybatis.queryStudent("zhangsan");Student stu3 = sjdwzMybatis.queryStudent("zhangsan");Student stu4 = sjdwzMybatis.queryStudent("zhangsan");}
}

这样会有大量具有相同属性的student被外部创建,同时查库次数过多。

我们是否能设计一个缓存,来保存查过的内容,再查相同的记录时,可以很快拿到原来的原型对象呢?

那我们的SjdwzMybatis便变成了如下代码:

public class SjdwzMybatis {//缓存private Map<String,Student> stuCache = new HashMap<>();/*** 通过name获取Student*/public Student queryStudent(String name){if(stuCache.containsKey(name)){return stuCache.get(name);}else{return queryStudentFromDB(name);}}/*** 演示从数据库查Student*/private Student queryStudentFromDB(String name) {//简单演示,查询到了System.out.println("从数据库查询到了:"+name);Student student = new Student();student.setName(name);student.setAge(16);//存入内存stuCache.put(name,student);return student;}
}

但是这是否会有问题呢?

修改属性

如果我们把stu1的属性改了,那么stu2、stu3、stu4的属性也会被改变,这会影响到我们缓存里的数据,造成脏缓存数据;同时我们查出来的内容,并没有提交修改,不能就把原数据给修改掉。

原型模式

我们把Student修改成如下代码,这便是原型模式:

//实现Cloneable接口,这只是一个标记,还需要重写clone()方法
public class Student implements Cloneable{private String name;private Integer age;//重写clone方法@Overrideprotected Object clone() throws CloneNotSupportedException {Student student = new Student();student.setName(this.name);student.setAge(this.age);return student;}
}

然后SjdwzMybatis修改为如下代码:

public class SjdwzMybatis {//缓存private Map<String,Student> stuCache = new HashMap<>();/*** 通过name获取Student*/public Student queryStudent(String name) throws CloneNotSupportedException {if(stuCache.containsKey(name)){return (Student) stuCache.get(name).clone();}else{return queryStudentFromDB(name);}}/*** 演示从数据库查Student*/private Student queryStudentFromDB(String name) throws CloneNotSupportedException {//简单演示,查询到了System.out.println("从数据库查询到了:"+name);Student student = new Student();student.setName(name);student.setAge(16);//存入内存stuCache.put(name,(Student) student.clone());return student;}
}

从数据库查出来放入缓存的对象与从缓存取出来的都是clone出来的。

可以看到,我们对stu1修改,并不会影响其他的数据了。

效果

http://www.15wanjia.com/news/55877.html

相关文章:

  • 南京外贸网站建设广东知名seo推广多少钱
  • 长沙住房和城乡建设部网站友链外链app
  • 常用的网站推广的方式方法seo公司怎么推广宣传
  • 网页游戏传奇霸业搜索引擎优化作业
  • 做集团网站应注意什么网上怎么推销自己的产品
  • 大连网站建设 仟亿软件培训班学费多少
  • 一个网站如何做双语荆门网站seo
  • 台州网站建设企业网站安全检测工具
  • 一个公司如何做多个网站备案seo课程培训班
  • 长安网站建设多少钱最近国际时事热点事件
  • 海南招聘网seo 重庆
  • 网站内容优化方法成都网站建设技术外包
  • 汕头网站建设推广上海百度提升优化
  • 怎么更改网站首页图片尺寸关键词优化外包
  • 扬州建设信用网站seo同行网站
  • cn域名建网站什么是电商?电商怎么做
  • 中小网站公司做的推广怎么样在线咨询
  • 邯郸做网站哪里好网络营销首先要进行
  • 商城网站具体需求seo数据是什么意思
  • 做网站一天能接多少单google登录
  • 重庆网站优化方式网站seo查询工具
  • 广州大型网站建设公司互联网广告销售是做什么的
  • 那个网站系统好搜索引擎营销概念
  • 论坛平台主要产品武汉网站推广优化
  • 淘宝店铺装网站导航怎么做关键词分词工具
  • 县网站建设方案百度指数特点
  • 高端自适应网站建设聊城seo整站优化报价
  • 外冈网站建设全国疫情实时动态
  • 导购网站免费推广鞍山网络推广
  • 上海 有哪些做网站的公司seo网络推广什么意思