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

枣庄三合一网站建设公司做英文企业网站

枣庄三合一网站建设公司,做英文企业网站,中国互联网四大门户,360信息流广告平台导航#xff1a; 【Java笔记踩坑汇总】Java基础JavaWebSSMSpringBootSpringCloud瑞吉外卖/黑马旅游/谷粒商城/学成在线设计模式面试题汇总性能调优/架构设计源码-CSDN博客​ 目录 零、经典的克隆羊问题#xff08;复制10只属性相同的羊#xff09; 一、传统方案#xff1… 导航 【Java笔记踩坑汇总】Java基础JavaWebSSMSpringBootSpringCloud瑞吉外卖/黑马旅游/谷粒商城/学成在线设计模式面试题汇总性能调优/架构设计源码-CSDN博客​ 目录 零、经典的克隆羊问题复制10只属性相同的羊 一、传统方案循环new对象 1.1 实现方案 1.2 优缺点和改进思路  二、原型模式Prototype模式 2.1 基本介绍 2.2 原理 2.2.1 UML图原型接口、具体原型类、客户端代码 2.2.2 代码演示 2.3 原型模式解决克隆羊问题 2.4 优缺点和使用场景  2.4.1 优点 2.4.2 缺点 2.4.3 适用场景 三、扩展 3.1 Spring源码中的原型模式ApplicationContext类的getBean()方法 3.2 浅拷贝和深拷贝 3.2.1 浅拷贝引用类型变量拷贝引用 3.2.2 深拷贝引用类型变量拷贝值 零、经典的克隆羊问题复制10只属性相同的羊 问题描述现在有一只羊姓名为 Tom年龄为 1颜色为白色请编写程序创建和 Tom 羊属性完全相同的 10 只羊。 一、传统方案循环new对象 1.1 实现方案 羊类 public class Sheep {private String name;private Integer age;public Sheep(String name, Integer age) {this.name name;this.age age;}public String getName() {return name;}public void setName(String name) {this.name name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age age;} } 克隆羊 public class Client {public static void main(String[] args) {for (int i 0; i 10; i) {Sheep sheep new Sheep(Tom, 1, 白色);System.out.println(sheep);}} } 1.2 优缺点和改进思路  传统方法优点 好理解简单易操作 缺点 每次获取再复制效率低在创建新的对象时总是需要重新获取原始对象的属性如果创建的对象比较复杂时效率较低不灵活总是需要重新初始化对象而不是动态地获得对象运行时的状态不够灵活 改进的思路分析Object 类的 clone() 方法 Object 类是所有类的根类Object 类提供了一个 clone 方法该方法可以将一个 Java 对象复制一份但是对应的类必须实现Cloneable接口该接口表示该类能够复制且具有复制的能力 原型模式 二、原型模式Prototype模式 2.1 基本介绍 原型模式Prototype 模式用原型实例指定创建对象种类并通过拷贝原型创建新的对象 原型模式是一种创建型设计模式允许一个对象再创建另外一个可定制的对象无需知道如何创建的细节。 原理将一个原型对象传给要发动创建的对象这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建即对象.clone() 形象的理解孙大圣拔出猴毛变出其它孙大圣 创建型设计模式关注如何有效地创建对象以满足不同的需求和情境。 包括单例模式、抽象工厂模式、原型模式、建造者模式、工厂模式 2.2 原理 2.2.1 UML图原型接口、具体原型类、客户端代码 Prototype原型类。包含一个用于复制对象的克隆方法。可以使用Cloneable接口作为原型接口。ConcretePrototype具体原型类。实现原型接口、重写克隆方法clone()的具体类。Client让一个原型对象克隆自己创建一个属性相同的对象 2.2.2 代码演示 原型接口 可以是Cloneable接口也可以是自定义带clone()方法的接口 // 步骤1定义原型接口 interface Prototype extends Cloneable {Prototype clone(); }具体原型类  // 步骤2实现具体原型类 class ConcretePrototype implements Prototype {Overridepublic Prototype clone() {try {return (Prototype) super.clone(); // 使用浅拷贝} catch (CloneNotSupportedException e) {e.printStackTrace();return null;}} } 客户端代码 通过clone()方法创建原型对象 // 步骤3客户端代码 public class Client {public static void main(String[] args) { //创建具体类对象ConcretePrototype prototype new ConcretePrototype(); //通过clone方法创建对象ConcretePrototype clonedObject (ConcretePrototype) prototype.clone();} }2.3 原型模式解决克隆羊问题 问题回顾  现在有一只羊姓名为 Tom年龄为 1颜色为白色请编写程序创建和 Tom 羊属性完全相同的 10 只羊。 UML 类图 原型接口Cloneable接口。 具体原型类实现Cloneable接口 Data public class Sheep implements Cloneable {private String name;private Integer age;private String color;public Sheep(String name, Integer age, String color) {this.name name;this.age age;this.color color;}Overrideprotected Object clone() {Sheep sheep null;try {sheep (Sheep) super.clone();} catch (Exception e) {e.printStackTrace();}return sheep;} }客户端 调用具体原型类的clone()方法创建10个对象 public class Client {public static void main(String[] args) {Sheep sheep new Sheep(Tom, 1, 白色);for (int i 0; i 10; i) {Sheep sheep1 (Sheep) sheep.clone();System.out.println(sheep1);}} } 2.4 优缺点和使用场景  2.4.1 优点 构造方法复杂时开销小如果构造函数的逻辑很复杂此时通过new创建该对象会比较耗时那么就可以尝试使用克隆来生成对象。运行时动态创建对象不用重新初始化对象而是动态地获得对象运行时的状态开闭原则OCP原则如果原始对象发生变化增加或者减少属性其它克隆对象的也会发生相应的变化无需更改客户端代码。相反如果使用new方式就需要在客户端修改构造参数。这使得系统更加灵活和可维护。对象封装性原型模式可以帮助保护对象的封装性因为客户端代码无需了解对象的内部结构只需知道如何克隆对象。多态性原型模式支持多态性因为克隆操作可以返回具体子类的对象而客户端代码不需要关心对象的具体类。 扩展 开闭原则OCP原则代码对修改关闭对扩展开放。 2.4.2 缺点 构造方法简单时开销大如果构造函数的逻辑很简单原型模式的效率不如new因为JVM对new做了相应的性能优化。 //验证构造方法简单时原型模式开销大long startTime System.currentTimeMillis();Student student new Student();//克隆循环十万次for (int i 0; i 100000; i) {student.clone();}long midTime System.currentTimeMillis(); //20msSystem.out.println(克隆生成对象耗费的时间: (midTime - startTime) ms);//new10万次for (int i 0; i 100000; i) {new Student();} //5msSystem.out.println(new生成对象耗费的时间: (System.currentTimeMillis() - midTime) ms);要注意深拷贝和浅拷贝问题实现Cloneable接口时如果具体原型类直接返回super.clone()则是浅拷贝。克隆的对象里引用类型变量只拷贝引用依然指向旧的地址。代码复杂性在实现深拷贝的时候可能需要比较复杂的代码。设计模式一般都是以代码复杂性为代价提高可扩展性、可读性。 2.4.3 适用场景 构造方法复杂要创建的对象构造方法逻辑很复杂即创建新的对象比较复杂时使用原型模式会比直接new效率更高经常需要克隆经常要创建一个和原对象属性相同的对象时可以考虑原型模式。 三、扩展 3.1 Spring源码中的原型模式ApplicationContext类的getBean()方法 Spring 框架Bean的生命周期中ApplicationContext类的getBean()方法中有用到原型模式。 获取Bean时会判断配置的Bean是单例还是原型如果是原型则用原型模式创建Bean。 验证bean指定原型模式后getBean()获取到的多个Bean是不同对象。 Component(id01) Scope(prototype) public class Monster {private String name;private int health;public Monster() {// 默认构造函数}public Monster(String name, int health) {this.name name;this.health health;}// 添加其他属性和方法 }也可以用xml形式注册Bean !-- 这里我们使用scopeprototype即 原型模式来创建 -- bean idid01 classcom.atquigu.spring.bean.Monster scopeprototype/ /beans测试  public class ProtoType {public static void main(String[] args) {// TODO Auto-generated method stubApplicationContext applicationContext new ClassPathXmlApplicationContext(beans.xml);// 通过ID获取MonsterObject bean applicationContext.getBean(id01);System.out.println(bean: bean); // 输出“牛魔王....Object bean2 applicationContext.getBean(id01);System.out.println(bean2: bean2); // 输出“牛魔王....System.out.println(bean bean2); // false} }注解方式是Scope(prototype)。 回顾 手写Spring源码简化版-CSDN博客 3.2 浅拷贝和深拷贝 3.2.1 浅拷贝引用类型变量拷贝引用 浅拷贝拷贝后对象是新地址基本类型变量拷贝值引用类型变量拷贝引用。只复制某个对象的引用而不复制对象本身新旧对象还是共享同一块内存。深拷贝拷贝后对象是新地址基本类型变量拷贝值引用类型变量拷贝克隆后的值。创造一个一摸一样的对象新对象和原对象不共享内存修改新对象不会改变原对对象。反序列化创建对象是深拷贝。 实现方案具体原型类直接返回super.clone() 实现Cloneable 接口重写 clone()方法 直接返回super.clone()。 public class Person implements Cloneable { //虽然clone()是Object类的方法但Java规定必须得实现一下这个接口public int age;//基本类型变量拷贝值public Person(int age) {this.age age;}Overridepublic Person clone() {try {return (Person) super.clone();} catch (CloneNotSupportedException e) {return null;}}public static void main(String[] args) {Person p1 new Person(18);Person p2 p1.clone(); //p2将是p1浅拷贝的对象p2.age 20;System.out.println(p1 p2); // false。拷贝后对象是新地址System.out.println(p1.age); // 18。基本类型变量拷贝值} } 3.2.2 深拷贝引用类型变量拷贝值 深拷贝拷贝后对象是新地址基本类型变量拷贝值引用类型变量拷贝克隆后的值。创造一个一摸一样的对象新对象和原对象不共享内存修改新对象不会改变原对对象。反序列化创建对象是深拷贝。  实现方案具体原型类专门克隆引用类型变量 实现Cloneable 接口重写 clone()方法 给super.clone()的引用类型成员变量也clone()一下然后再返回克隆的对象。  public class Person implements Cloneable {public int age;//基本类型变量拷贝值public int[] arr new int[] {1, 2, 3};public Person(int age) {this.age age;}Overridepublic Person clone() {try {Person person (Person) super.clone();person.arr this.arr.clone(); // 用引用类型的 clone 方法引用类型变量拷贝克隆后的值return person;} catch (CloneNotSupportedException e) {return null;}} }
http://www.tj-hxxt.cn/news/132313.html

相关文章:

  • 海关网站建设方案南充网站建设公司
  • 残疾人信息无障碍网站建设邢台哪里提供网站制作
  • 浙江省住房和城乡建设厅网站打不开东莞网站建设服务首
  • steam网站代做官网网站建设平台
  • 做网站最小的字体是多少钱北京网址
  • 模板网站的弊端佛山有几个区
  • 公司网站建设怎么规划比较好南阳网站建设优化
  • 网站建设需要注意哪些成立学校网站建设小组
  • 婚纱网站策划书做网站选择系统
  • 公司 网站 模板dede网站建设的个人总结
  • 太原网站建设加q.479185700攻击wordpress
  • 阜城网站建设代理企业网站开发毕业报告
  • 网站优化是做什么的怀化seo
  • 怎么样模仿网站海口的网站建设公司
  • 重庆网站建设子沃科技熊掌号牟平网站建设
  • 织梦 xml网站地图自己网站开发
  • 国外手机网站设计成都旅游公司排名前十
  • 上海网站建设网络推广wordpress 描文本优化
  • 宁波网站推广宣传公司排名林西网站建设优化
  • 哪个网站是自己销售网站seo设置
  • 公司形象墙设计方案黄骅做网站|黄骅网站|黄骅百度优化|黄骅百度推广|黄骅微信|黄骅
  • 珲春市建设局网站是多少怎么做表格
  • 网站建设背景怎么设置成私人网官网
  • wordpress建站上海金昌百度seo
  • dede网站后台模板网站搭建与生成技术教材
  • 凡科快速建站wordpress 图片加水印
  • 长沙网站制作哪家强网站怎么做的精致一点
  • 做一个二手网站怎么做怎样建立自己网站视频网站
  • 高安建站公司互联网电商
  • 做婚姻介绍网站赚钱吗手机本地建WordPress