当前位置: 首页 > 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/17177.html

相关文章:

  • 网站推广需要几个人做广东省疫情最新
  • 大专网页设计工资怎么样合肥百度seo排名
  • 做公众号封面的网站宁波seo排名方案优化公司
  • ppt做的模板下载网站电销系统
  • 如何由网页生成网站一个网站如何推广
  • 青岛鲁icp 网站制作 牛商网免费的h5制作网站
  • 360全景网站建设seo商学院
  • 做网站可以不做后端吗引擎优化seo怎么做
  • 网上商城排名seo公司是什么意思
  • 做网站大优惠网店代运营骗局
  • 自己设置网站怎么做如何进行电子商务网站推广
  • 做公司网站软件百度平台营销软件
  • 网站建设服务方案店铺100个关键词
  • 咨询聊城网站建设南昌seo教程
  • 网站建设综合技术填写电话的广告
  • 网站建设 南宁小程序开发收费价目表
  • 淘宝客网站模板免费下载重庆自动seo
  • 网站制作 杭州公司百度推广服务
  • 分析网站外链分析工具免费的网络推广渠道有哪些
  • 小游戏网站审核怎么做网络营销策划与创意
  • r语言做网站房管局备案查询网站
  • 桥东网站建设如何优化搜索关键词
  • 网站建设seo视频淘宝关键词推广
  • 做网站前必须设计原型吗谷歌海外推广怎么做
  • 大理 网站建设百度免费注册
  • 清河做网站哪里便宜网络推广费用高吗
  • 网站建设各语言优点种子搜索神器在线引擎
  • 试用网建设网站做网站的公司哪家好
  • 大学做视频网站外链发布网站
  • 一个人做网站怎样做自己的网站