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

湛江市建设规划局网站做暧暧xoxo网站

湛江市建设规划局网站,做暧暧xoxo网站,怎么制作自己的头像logo,wordpress 水墨原型模式#xff08;Prototype Pattern#xff09;是用于创建重复的对象#xff0c;同时又能保证性能。这种类型的设计模式属于创建型模式#xff0c;它提供了一种创建对象的最佳方式。 这种模式是实现了一个原型接口#xff0c;该接口用于创建当前对象的克隆。当直接创建…原型模式Prototype Pattern是用于创建重复的对象同时又能保证性能。这种类型的设计模式属于创建型模式它提供了一种创建对象的最佳方式。 这种模式是实现了一个原型接口该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时则采用这种模式。例如一个对象需要在一个高代价的数据库操作之后被创建。 我们可以缓存该对象在下一个请求时返回它的克隆在需要的时候更新数据库以此来减少数据库调用。 用原型实例来指定创建对的种类并且通过拷贝这些原型来创建新的对象。 在什么情况下使用原型模式 在类的初始化消耗的资源非常之多的时候使用使用new创建一个对象需要非常烦琐的过程构造函数比较复杂在循环体中产生大量对象 注意原型模式中有使用克隆操作来实现复制类但是clone操作又可以分为深克隆和浅克隆之分既然要用到clone操作我们知道深拷贝需要实现CloneableSerializable两个接口重写clone方法并且在java中我们主要使用的clone操作都是浅拷贝。 其深拷贝具体方法 实现 Cloneable 接口递归 clone 引用对象或 new 新对象(类的属性字段未实现 Cloneable 接口)借助序列化完成深拷贝如实现 JDK java.io.Serializable 接口、json格式序列化、xml格式序列化等。 原型模式UML图 这里我从软件设计师书本上摘抄到一个例子来介绍 Prototype模式适用于 当一个系统应该独立于它的产品创建、构成和表示时。当要实例化的类是在运行时刻指定时例如通过动态装载。为了避免创建一个与产品类层次平行的工厂类层次时。当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。 原型模式代码 根据上述UML图我们来具体实现 public class Main {public static void main(String[] args) {Product product1 new Product(2023, 5.8);System.out.println(product1.getId() product1.getPrice());// Product product2 new Product(2023, 5.8);Product product2 (Product) product1.Clone();System.out.println(product2.getId() product2.getPrice());Product product3 (Product) product1.Clone();System.out.println(product3.getId() product3.getPrice());} }interface Prototype {public Object Clone(); }class Product implements Prototype {private int id;private double price;//创建无参构造方法public Product() {}//有参构造public Product(int id, double price) {this.id id;this.price price;}public int getId() {return id;}public double getPrice() {return price;}Overridepublic Object Clone() {Product object new Product();object.id this.id;object.price this.price;return object;} }通过上述方式我们就已经简单实现一个原型模式了。 第二个实例实现原型模式 这个图应该看得懂吧?孙大圣以及金箍棒首先孙悟空是猴子他有个绰号叫齐天大圣我们在齐天大圣里边实现原型模式。 public class Monkey {public int height;public int weight; //基本型数据public Date birthday;}创建金箍棒实现序列化接口 //金箍棒 public class JinGuBang implements Serializable {public float h 100;public float d 10;//金箍棒变大public void big(){this.d * 2;this.h * 2;} //金箍棒变小public void small(){this.d / 2;this.h / 2;}Overridepublic String toString() {return JinGuBang{ h h , d d };} }public class QiTianDaSheng extends Monkey implements Cloneable,Serializable {public JinGuBang jinGuBang;Object obj;//先初始化一些数值public QiTianDaSheng(){//只是初始化this.birthday new Date();this.jinGuBang new JinGuBang();}//将原来的浅克隆改为深克隆.Overrideprotected Object clone() throws CloneNotSupportedException {// return super.clone();// return this.shallowClone(this); //浅克隆return this.deepClone(); //深克隆}//利用对象流完成深克隆, 还有一种麻烦的实现: 递 归./*深复制把要复制的对象所引用的对象都复制了一遍。拷贝需要实现Cloneable, Serializable两个接口重写clone方法*/public Object deepClone(){try{ByteArrayOutputStream bos new ByteArrayOutputStream();ObjectOutputStream oos new ObjectOutputStream(bos);oos.writeObject(this);oos.flush();ByteArrayInputStream bis new ByteArrayInputStream(bos.toByteArray());ObjectInputStream ois new ObjectInputStream(bis);QiTianDaSheng copy (QiTianDaSheng)ois.readObject();copy.birthday new Date();return copy;}catch (Exception e){e.printStackTrace();return null;}}//浅克隆public QiTianDaSheng shallowClone(QiTianDaSheng target){QiTianDaSheng qiTianDaSheng new QiTianDaSheng();qiTianDaSheng.height target.height;qiTianDaSheng.weight target.weight;//浅克隆对对象类型的数据只克隆了地址没有复制值qiTianDaSheng.jinGuBang target.jinGuBang; //对于引用型的数据只克隆了地址.qiTianDaSheng.birthday new Date();return qiTianDaSheng;}Overridepublic String toString() {return QiTianDaSheng{ jinGuBang jinGuBang , height height , weight weight , birthday birthday };} }public class DeepCloneTest {public static void main(String[] args) {QiTianDaSheng qiTianDaSheng new QiTianDaSheng();try {QiTianDaSheng clone (QiTianDaSheng)qiTianDaSheng.clone();System.out.println( 克隆: clone);System.out.println( qiTianDaSheng );//原型模式下对象创建了两次,但值 一样.System.out.println( hashcode: clone.hashCode()\t qiTianDaSheng.hashCode() );//jingubang是一个引用型 对于浅克隆.System.out.println( jingubang的hashcode: clone.jinGuBang.hashCode() \t qiTianDaSheng.jinGuBang.hashCode() );// System.out.println(判断克隆结果,如两个jinGuBang对象相同则为浅克隆如不同则为深克隆 (qiTianDaSheng.jinGuBang clone.jinGuBang));} catch (Exception e) {e.printStackTrace();}// QiTianDaSheng q new QiTianDaSheng(); // QiTianDaSheng n q.shallowClone(q); // System.out.println(浅克隆 (q.jinGuBang n.jinGuBang));} }至此我们通过齐天大圣类来完成类的克隆并且实现序列化接口和Cloneable接口完成深克隆操作来实现原型模式。如果以上介绍还不是看的很爽那我们接着看。 第三个实例实现原型模式 老样子先摆上UML图。 创建一个shape类作为父类 public abstract class Shape implements Cloneable {private String id;protected String type;public List values;//注意关键是在 这里应该重写一个clone()方法,提供对象克隆功能。默认是一个浅克隆.Overridepublic Object clone() {Object clone null;try {clone super.clone(); ///} catch (CloneNotSupportedException e) {e.printStackTrace();}return clone;}abstract void draw();public void setValues(List values) {this.values values;}public List getValues() {return values;}public String getType(){return type;}public String getId() {return id;}public void setId(String id) {this.id id;} }创建子类 public class Circle extends Shape implements Cloneable{public Circle(){type Circle;}Overridepublic void draw() {System.out.println(Inside Circle::draw() method.);} }public class Rectangle extends Shape {public Rectangle(){type Rectangle;}Overridepublic void draw() {System.out.println(Inside Rectangle::draw() method.);} }public class Square extends Shape {public Square(){type Square;}Overridepublic void draw() {System.out.println(Inside Square::draw() method.);} }创建好克隆类 public class ShapeCache {//用一个容器存好原始对象.private static HashtableString, Shape shapeMap new HashtableString, Shape();//如果要获取某个对象的一个拷贝则从容器中取出原型 再调用原型的拷贝方法public static Shape getShape(String shapeId) {Shape cachedShape shapeMap.get(shapeId);return (Shape) cachedShape.clone();}// 对每种形状都运行数据库查询并创建该形状// shapeMap.put(shapeKey, shape);// 例如我们要添加三种形状( 这就是三种形状的原型, 以用于后期的拷贝 )public static void loadCache() {Circle circle new Circle();circle.setId(1);List listnew ArrayList();list.add(1);list.add(2);circle.setValues( list );shapeMap.put(circle.getId(),circle);Square square new Square();square.setId(2);shapeMap.put(square.getId(),square);Rectangle rectangle new Rectangle();rectangle.setId(3);shapeMap.put(rectangle.getId(),rectangle);} }创建测试类 public class PrototypePatternDemo {public static void main(String[] args) {ShapeCache.loadCache(); //首先加载 类的原型实例.//以下操作获取原型的克隆对象.Shape clonedShape (Shape) ShapeCache.getShape(1);//在这里可以对这个对象进行值 的设置想像一下如果这个对象有多个值 要设置的话避免了创建对象的消耗.System.out.println(Shape : clonedShape.getType() clonedShape);Shape cs2 (Shape) ShapeCache.getShape(1);//在这里可以对这个对象进行值 的设置想像一下如果这个对象有多个值 要设置的话避免了创建对象的消耗.cs2.setId(333);// *******注意两次获取的对象不同,这叫原型模式System.out.println(Shape : cs2.getType() cs2 );Shape clonedShape2 (Shape) ShapeCache.getShape(2);System.out.println(Shape : clonedShape2.getType()); Shape clonedShape3 (Shape) ShapeCache.getShape(3);System.out.println(Shape : clonedShape3.getType());//默认情况下: clone()是一个浅克隆.System.out.println( 两次产生的对象中的 引用类型的属性值(地址) 是相等的: ( clonedShape.valuescs2.values ) );//这说明 当对clonedShape中的 values进行修改时 cs2.values也会变这肯定是不被 允许 .clonedShape.values.add(abc); // cs2.values也会变for( Object o:cs2.values){System.out.println( o );}// 下面改为深克隆来完成对对象属性值 的复制.} }
http://www.dnsts.com.cn/news/55160.html

相关文章:

  • 网站建设下一步工作计划动漫制作专业烧钱吗
  • 个人网站设计步骤手机网站如何建立
  • 什么网站可以做电影投资西安专业seo
  • 上海建设工程招投标在什么网站宝塔wordpress安装
  • 网站建立需要哪些材料建筑图纸怎么学看图
  • 网站建设全部流程成都电话营销外包公司
  • 网站建设的成本分析服务器怎样建设网站
  • 网站设计需要什么专业字体设计免费版在线立即生成
  • 优质的南昌网站设计wordpress自学
  • 昆明大型网站建设wordpress移动端底部导航栏
  • 厦门免费建立企业网站飞飞影视做的网站
  • easyui 网站设计有哪些网络推广平台
  • 教你如何创建自己的网站wordpress换域名修改
  • 手机网站建设制作教程建站程序下载
  • 不用iis建立网站wordpress伪原创设置
  • 如何制作手机网站同声传译公司网站建设
  • 新开河街做网站公司给企业做网站推广好么?
  • 有免费做推广的网站吗小说插件 wordpress
  • 门户网站建设项目书rt-theme 18 wordpress
  • 国内免费建站网站深圳做网站便宜
  • 温州快速建站公司网站建设合同 印花税
  • 网站建设用的软件wordpress内核源码
  • 松江网站建设品划网络wordpress的根目录在哪里
  • 九江网站建设哪家好成都网站建设服务商
  • 湘潭网站开发免费的舆情网站不用下载直接打开
  • 自己做游戏app的网站吗专业的单位网站开发
  • 怎么做frontpage网站网站规划网站建设报价表
  • wordpress网站建小程序金寨县建设局网站
  • 网站中的搜索功能怎么做杭州市建设局网站
  • 怎么做交易网站十堰网站建设培训学校