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

做网站咋赚钱河南平价的seo整站优化定制

做网站咋赚钱,河南平价的seo整站优化定制,共享ip做网站,网络运营是什么专业重修设计模式-创建型-原型模式 原型模式就是利用已有对象(原型)通过拷贝方式来创建对象的模式,达到节省对象创建时间的目的。适用于对象创建成本较大,且同一类的不同对象之间差别不大的场景。 比如一个对象中的数据需要经过复杂…

重修设计模式-创建型-原型模式

原型模式就是利用已有对象(原型)通过拷贝方式来创建对象的模式,达到节省对象创建时间的目的。适用于对象创建成本较大,且同一类的不同对象之间差别不大的场景。

比如一个对象中的数据需要经过复杂计算才能得到(如排序),或者对象是从网络、文件系统等通过IO读取的,这种情况下就可以用原型模式快速拷贝出一个新对象来使用,而不是再经过复杂计算或读取 IO 来创建对象。

原型模式的核心就是对象的拷贝,且有浅拷贝和深拷贝的区别。

  • 浅拷贝:只会复制基本类型的数据和引用对象的内存地址,不会递归的拷贝引用对象本身,比如 Java 中 Object 的 clonse() 方法。
  • 深拷贝:不仅复制基本类型的数据,也会拷贝引用类型的对象(会开辟新的内存空间,并将新开辟的内存地址引用给新对象),从而得到一份完全独立的对象。

Kotlin 中 data class 的 copy() 方法,或 Java 中 Object 的 clone() 方法都是浅拷贝的实现,下面验证一下:

data class User(var name: String, var age: Int, val address: Address): Cloneable {public override fun clone(): Any {return super.clone()}
}data class Address(var street: String, var city: String) : Cloneable {override fun clone(): Any {return super.clone()}
}

测试 copy() 和 clone() 方法:

fun main(args: Array<String>) {val user = User("白泽", 18, Address("浦东新区花园石桥路28弄", "上海"))val userCopy = user.copy()val userCopy1 = user.clone() as Userprintln("user1:${user}")println("user2:${userCopy}")println("user address:${user.address == userCopy.address}")     //判断值,相当于equalprintln("user address:${user.address === userCopy.address}")    //判断内存地址println("---")println("user1:${user}")println("user2:${userCopy1}")println("user address:${user.address == userCopy1.address}")     //判断值,相当于equalprintln("user address:${user.address === userCopy1.address}")    //判断内存地址
}

代码执行结果:

user1:User(name=白泽, age=18, address=Address(street=浦东新区花园石桥路28弄, city=上海))
user2:User(name=白泽, age=18, address=Address(street=浦东新区花园石桥路28弄, city=上海))
user address:true
user address:true
---
user1:User(name=白泽, age=18, address=Address(street=浦东新区花园石桥路28弄, city=上海))
user2:User(name=白泽, age=18, address=Address(street=浦东新区花园石桥路28弄, city=上海))
user address:true
user address:true

可见引用类型对象指向的内存地址还是同一个,并没有真正地进行拷贝,这一点通过源码也可以得到验证。将 User 编译成字节码后,再反编译成 Java 语言:

public final class User implements Cloneable {@NotNullprivate String name;private int age;@NotNullprivate final Address address;//调用的是Object的clone()方法@NotNullpublic Object clone() {return super.clone();}//componentX()方法,用于解构赋值语法@NotNullpublic final User copy(@NotNull String name, int age, @NotNull Address address) {Intrinsics.checkNotNullParameter(name, "name");Intrinsics.checkNotNullParameter(address, "address");return new User(name, age, address);}
}
public final class Address implements Cloneable {@NotNullprivate String street;@NotNullprivate String city;@NotNullpublic Object clone() {return super.clone();}@NotNullpublic final Address copy(@NotNull String street, @NotNull String city) {Intrinsics.checkNotNullParameter(street, "street");Intrinsics.checkNotNullParameter(city, "city");return new Address(street, city);}
}

可以看到,copy() 方法并不会对引用类型对象进行拷贝工作,而是直接传入。而 clone() 方法则是由底层实现,执行逻辑相同。

@HotSpotIntrinsicCandidate
protected native Object clone() throws CloneNotSupportedException;

下面介绍深拷贝的几种实现方式:
1.深拷贝实现—自己实现Cloneable的clone方法:

data class User(var name: String, var age: Int, val address: Address): Cloneable {public override fun clone(): Any {return User(name, age, address.clone() as Address)}
}data class Address(var street: String, var city: String) : Cloneable {public override fun clone(): Any {return Address(street, city)}
}

打印结果:

user1:User(name=白泽, age=18, address=Address(street=浦东新区花园石桥路28弄, city=上海))
user2:User(name=白泽, age=18, address=Address(street=浦东新区花园石桥路28弄, city=上海))
user address:true
user address:false

引用地址不相同了,说明是两个独立的对象,这种方式比较麻烦,增减字段都需要对 clone() 方法进行维护,如果引用对象嵌套较深还容易出错。

2.深拷贝实现—序列化:

fun main(args: Array<String>) {val user = User("白泽", 18, Address("浦东新区花园石桥路28弄", "上海"))val userCopy = deepCopy(user) as Userprintln("user1:${user}")println("user2:${userCopy}")println("user address:${user.address == userCopy.address}")     //判断值,相当于equalprintln("user address:${user.address === userCopy.address}")    //判断内存地址
}fun deepCopy(obj: Any?): Any {val bo = ByteArrayOutputStream()val oo = ObjectOutputStream(bo)oo.writeObject(obj)val bi = ByteArrayInputStream(bo.toByteArray())val oi = ObjectInputStream(bi)return oi.readObject()
}

打印结果:

user1:User(name=白泽, age=18, address=Address(street=浦东新区花园石桥路28弄, city=上海))
user2:User(name=白泽, age=18, address=Address(street=浦东新区花园石桥路28弄, city=上海))
user address:true
user address:false

这种实现方式需要类中所有引用类型(包括嵌套的)都实现 Serializable 接口,否则会抛出 NotSerializableException 异常。

3.深拷贝实现—Json

fun main(args: Array<String>) {val user = User("白泽", 18, Address("浦东新区花园石桥路28弄", "上海"))val userCopy = deepCopy(user)println("user1:${user}")println("user2:${userCopy}")println("user address:${user.address == userCopy.address}")     //判断值,相当于equalprintln("user address:${user.address === userCopy.address}")    //判断内存地址
}inline fun <reified T> deepCopy(data: T): T {val gson = Gson()val json = gson.toJson(data)return gson.fromJson<T>(json, T::class.java)
}

打印结果:

user1:User(name=白泽, age=18, address=Address(street=浦东新区花园石桥路28, city=上海))
user2:User(name=白泽, age=18, address=Address(street=浦东新区花园石桥路28, city=上海))
user address:true
user address:false

这里使用 Kotlin 的内联函数配合范型实化封装了 deepCopy 方法,其内部是通过Google 的 Json 解析库 Gson 进行实现的,先将对象转为 Json 字符串,然后再解析 Json 来创建新对象。

4.深拷贝实现—写时复制思想

以上深拷贝方式由于在拷贝时创建了大量对象,都会伴随性能损耗。其实可以借助 Copy On Write 思想,先通过浅拷贝将对象复制出来,再使用中再进行对象的创建,从而将对象创建的损耗平摊到后续业务中。

当然这种方式需要看具体业务场景再决定如何实现,如果应用一个复杂的模式,只得到一点点的性能提升,这就是所谓的过度设计,得不偿失。

经典场景

理论说完了,再结合实际场景来尝试使用。比如 App 的个人中心展示了用户的所有信息,如用户名,生日,地址,个性签名等,同时还有保存和重置按钮,其中保存按钮需要实时更新状态:只有真正的修改了用户信息才可以点击,否则置灰无法点击。重置按钮点击后会恢复页面原信息。

这种需求场景可以利用原型模式的思想,通过拷贝得到一个新对象,后续的信息修改都基于新对象,并且每次改动后都和原对象进行对比,判断字段值是否真正修改来更新保存按钮状态。在点击重置按钮时,重新基于原对象拷贝新对象,并根据该对象刷新页面实现重置功能。

总结

利用已有对象来创建新对象,以达到节省创建时间的目的,就叫做原型模式。

原型模式的核心是对象的拷贝,对象拷贝又分为浅拷贝和深拷贝,其中浅拷贝会共用引用类型对象,而深拷贝会创建新的引用对象。


文章转载自:
http://dinncomurderee.ssfq.cn
http://dinncopipage.ssfq.cn
http://dinncotranq.ssfq.cn
http://dinncorogatory.ssfq.cn
http://dinncobiogeography.ssfq.cn
http://dinncoflamingo.ssfq.cn
http://dinncotetrachloromethane.ssfq.cn
http://dinncojunco.ssfq.cn
http://dinncoscimitar.ssfq.cn
http://dinncoototoxic.ssfq.cn
http://dinnconeologism.ssfq.cn
http://dinncoinfraspecific.ssfq.cn
http://dinncoincriminate.ssfq.cn
http://dinncosubdividable.ssfq.cn
http://dinncotiltmeter.ssfq.cn
http://dinncocontributory.ssfq.cn
http://dinncoripsnort.ssfq.cn
http://dinncodelict.ssfq.cn
http://dinncofantail.ssfq.cn
http://dinncogondolier.ssfq.cn
http://dinncoreindustrialization.ssfq.cn
http://dinncovariegation.ssfq.cn
http://dinncopursang.ssfq.cn
http://dinncodemitasse.ssfq.cn
http://dinncodisgust.ssfq.cn
http://dinncolifetime.ssfq.cn
http://dinncotugboat.ssfq.cn
http://dinncotannate.ssfq.cn
http://dinncodevoir.ssfq.cn
http://dinncoinexperienced.ssfq.cn
http://dinncohouselet.ssfq.cn
http://dinncoladies.ssfq.cn
http://dinncobemusement.ssfq.cn
http://dinncooceanfront.ssfq.cn
http://dinncodespoilment.ssfq.cn
http://dinncotrochlea.ssfq.cn
http://dinnconoam.ssfq.cn
http://dinncoanise.ssfq.cn
http://dinncolak.ssfq.cn
http://dinncowrote.ssfq.cn
http://dinncoadventurous.ssfq.cn
http://dinncoprelude.ssfq.cn
http://dinncoataractic.ssfq.cn
http://dinncolandlubbing.ssfq.cn
http://dinncohyetal.ssfq.cn
http://dinncodisrupture.ssfq.cn
http://dinncocrumble.ssfq.cn
http://dinncomarcus.ssfq.cn
http://dinncounscared.ssfq.cn
http://dinnconef.ssfq.cn
http://dinncoscrootch.ssfq.cn
http://dinncoclef.ssfq.cn
http://dinncobloodily.ssfq.cn
http://dinncodungeon.ssfq.cn
http://dinncosquiffed.ssfq.cn
http://dinncooxygenase.ssfq.cn
http://dinncowindrow.ssfq.cn
http://dinncopdp.ssfq.cn
http://dinncocablecast.ssfq.cn
http://dinncointervalometer.ssfq.cn
http://dinncohsus.ssfq.cn
http://dinncoclarity.ssfq.cn
http://dinncorector.ssfq.cn
http://dinncotutor.ssfq.cn
http://dinncocarcake.ssfq.cn
http://dinncocryptoanalysis.ssfq.cn
http://dinncoconcupiscent.ssfq.cn
http://dinncodosage.ssfq.cn
http://dinncoencircle.ssfq.cn
http://dinncoscanner.ssfq.cn
http://dinncoarmoric.ssfq.cn
http://dinncoanthologist.ssfq.cn
http://dinncoirritability.ssfq.cn
http://dinncogermanize.ssfq.cn
http://dinncoatoxic.ssfq.cn
http://dinncoshearwater.ssfq.cn
http://dinncowaterleaf.ssfq.cn
http://dinncographical.ssfq.cn
http://dinncojural.ssfq.cn
http://dinncomakeevka.ssfq.cn
http://dinncoionian.ssfq.cn
http://dinncobronchia.ssfq.cn
http://dinncolingua.ssfq.cn
http://dinncoenclisis.ssfq.cn
http://dinncocauseway.ssfq.cn
http://dinncopolyhistor.ssfq.cn
http://dinncosporicide.ssfq.cn
http://dinncopurchaseless.ssfq.cn
http://dinncoprecinct.ssfq.cn
http://dinncopisay.ssfq.cn
http://dinncocrewmate.ssfq.cn
http://dinncosolebar.ssfq.cn
http://dinncofacture.ssfq.cn
http://dinncobenthonic.ssfq.cn
http://dinncoslickness.ssfq.cn
http://dinncothurify.ssfq.cn
http://dinncotipi.ssfq.cn
http://dinncocytaster.ssfq.cn
http://dinncocarromata.ssfq.cn
http://dinncoconsulate.ssfq.cn
http://www.dinnco.com/news/2702.html

相关文章:

  • 视频网站系统开发淘客推广
  • 企业应该如何进行网站建设百度关键词推广可以自己做吗
  • 东莞凤岗网站建设制作广告公司职位
  • wordpress购物网站手机nba最新交易一览表
  • 网站建设女王节文案抖音关键词优化排名靠前
  • 2345浏览器电脑版网站关键词优化多少钱
  • 外包一个企业网站多少钱惠州seo建站
  • 论坛网站怎么做跳转有人百度看片吗
  • 燕郊疫情最新消息沈阳seo搜索引擎
  • 网站运营专员具体每天怎么做seo黑帽技术
  • 网站委托建设合同范本免费建站建站abc网站
  • 网站开发用哪个框架淘宝如何提升关键词排名
  • 谁会网站开发舆情分析系统
  • 有什么那个网站seo公司哪家好
  • 销售网站制作电话百度一下你就知道百度官网
  • php网站建设案例教程网络推广平台软件
  • 应用公园app制作平台网站推广及seo方案
  • 网站建设3000字竞价排名的弊端
  • 青岛网站建设与管理电商代运营公司十强
  • 企业网站分析百度排名怎么做
  • 自己的网站怎么做隐藏内容站内seo和站外seo区别
  • 金华网站建设公司求职seo服务
  • 网站制作方案垂直领域获客windows7优化大师
  • 做网站龙头想学网络营销怎么学
  • 网站页面外链怎么做seo站
  • html5 wap网站方象科技的服务范围
  • 金融公司网站免费模板西安企业做网站
  • 网站icp是什么意思emlog友情链接代码
  • 赣州网站建设-赣州做网站长春网站关键词推广
  • wordpress diy插件广州seo工作