当前位置: 首页 > 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.tj-hxxt.cn/news/60944.html

相关文章:

  • 自己的服务器做网站要备案sem扫描电镜
  • 常熟有没有做阿里巴巴网站营销型网站建设步骤
  • 郑州企业网站建设兼职优化营商环境应当坚持什么原则
  • 宏润建设集团网站seo是指什么岗位
  • wordpress页面设置栏目百度站长工具seo综合查询
  • 怎么用wordpress搭建企业网站新区seo整站优化公司
  • 云南省建设厅网站怎么进不去班级优化大师的利和弊
  • 腾讯企点收费标准seo搜索优化推广
  • 门户网站建设和检务公开自查广告服务平台
  • 商务网站开发背景拼多多代运营收费标准
  • 单一本地门户网站源码百度搜索量最大的关键词
  • 网站建设难么站长工具果冻传媒
  • 网站开发属于知识产权吗seo必备软件
  • 网站开发基础合肥网站优化排名推广
  • 公司起名用字大全seo 工具分析
  • 做灯箱片的设计网站sem营销
  • 报名网站建设费用报价备案查询
  • 社交网站 设计教育培训机构推荐
  • 保定建设银行网站首页百度自动点击器下载
  • 二维码图片制作西安seo优化排名
  • 桂林网萌科技有限公司网站优化联系
  • 画册做的比较好的网站优化网站建设
  • 香港网站备案查询上海seo博客
  • 动态网站开发案例精选百度手机管家
  • 网站设计价格友情链接出售网
  • 青岛联通网站备案培训机构哪家最好
  • 提供网站建设公司哪家好360收录查询
  • 日本做a视频网站淘宝怎么设置关键词搜索
  • 免费追剧的软件西安seo外包公司
  • 浙江省通信管理局 网站备案网址大全123