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

网络行业都有哪些工作湖南seo快速排名

网络行业都有哪些工作,湖南seo快速排名,福州交通建设投资集团网站,打造一个网站需要多少钱设计模式—创建型模式之原型模式 原型模式(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/8766.html

相关文章:

  • 世界足球排名前100名百度关键词seo外包
  • 做电商在什么网站网页首页设计图片
  • 手机网站建设开发报价指数网站
  • 西安做网站多少钱网络营销和电子商务区别
  • 网站注册域名后怎么做企业网站怎么推广
  • 南京做网站哪家好网站推广一般多少钱
  • 政府网站方案城关网站seo
  • 广州建设银行投诉网站2023年适合小学生的新闻
  • jsp电商网站怎么做免费发广告的平台有哪些
  • 宁波 做网站网店推广策划书
  • 什么地方可以做网站如何做好推广
  • 电脑当服务器做网站怎么创建自己的网站平台
  • 沙河网站建设搜索引擎优化排名优化培训
  • 怎么做校园表白网站郑州厉害的seo优化顾问
  • 商城推广文案南宁seo排名优化
  • 青海省教育厅门户网站口碑营销的成功案例
  • 现在都有什么网站工作室站长之家ip地址归属查询
  • 网络服务商机构域名南昌seo优化公司
  • 商城网站制作什么样的人适合做营销
  • 半月报网站建设商务代表工作总结58同城推广
  • 网站备案信息真实核验单 下载登录百度账号
  • 昆明企业网站建设一条龙seo研究协会网是干什么的
  • 网站开发过程会遇到的问题怎么做一个自己的网站
  • 微信公众号网页版登录杭州百度seo优化
  • 如何做微信朋友圈网站seo挖关键词
  • 动态网站站内广告怎么做百度入口提交
  • 百度不更新网站seo站群优化
  • wordpress 千万数据库网站优化包括对什么优化
  • 重庆勘察设计网汕头seo服务
  • 网站开发工具中的三剑客长沙seo免费诊断