设计模式之--原型模式
1.原型模式定義
原型模式非常簡(jiǎn)單,定義如下:
用原型實(shí)例指定創(chuàng)建對(duì)象的種類(lèi),并且通過(guò)拷貝這些原型創(chuàng)建新的對(duì)象
2.通用類(lèi)圖
原型模式的核心是實(shí)現(xiàn)Cloneable接口,此接口為JDK提供的一個(gè)標(biāo)識(shí)接口,只有實(shí)現(xiàn)了此接口的類(lèi)才能被拷貝。
原型模式的通用類(lèi)圖如下;
3.通用原型實(shí)現(xiàn)代碼
原型類(lèi):
public class ConcretePrototype implements Cloneable {private int id;private String name;public ConcretePrototype() {System.out.println("ConcretePrototype construct.");}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overrideprotected Object clone() throws CloneNotSupportedException {ConcretePrototype concretePrototype = null;try {concretePrototype = (ConcretePrototype) super.clone();} catch (Exception e) {}return concretePrototype;}@Overridepublic String toString() {return "ConcretePrototype{" +"id=" + id +", name='" + name + '\'' +'}';} }Client測(cè)試代碼:
public class Client {public static void main(String[] args) throws Exception {ConcretePrototype concretePrototype = new ConcretePrototype();concretePrototype.setId(123);concretePrototype.setName("test");ConcretePrototype cloneType = (ConcretePrototype) concretePrototype.clone();cloneType.setId(111);cloneType.setName("test111");System.out.println(concretePrototype);System.out.println(cloneType);} }輸出結(jié)果如下:
ConcretePrototype construct. ConcretePrototype{id=123, name='test'} ConcretePrototype{id=111, name='test111'}通過(guò)輸出結(jié)果可以看出,通過(guò)clone方法拷貝了一個(gè)新的對(duì)象。
4.原型模式的優(yōu)點(diǎn)
1.性能優(yōu)良
原型模式是在內(nèi)存中二進(jìn)制流的拷貝,要比直接new一個(gè)對(duì)象快的多
2.通過(guò)3中的輸出結(jié)果來(lái)看,在clone對(duì)象的時(shí)候構(gòu)造函數(shù)不會(huì)執(zhí)行,這對(duì)于一些需要在構(gòu)造函數(shù)中做一些初始化的類(lèi)來(lái)說(shuō)可能稱(chēng)為約束
5.需要注意的點(diǎn)
在原型模式拷貝的時(shí)候需要注意可變引用類(lèi)型的屬性,下面通過(guò)一個(gè)例子來(lái)說(shuō)明此問(wèn)題:
拷貝對(duì)象:
Client類(lèi)
public class Client {public static void main(String[] args) throws Exception {DeepClone deepClone = new DeepClone();deepClone.addPair("key1", "value1");DeepClone clone = (DeepClone) deepClone.clone();clone.addPair("key2", "value2");System.out.println(deepClone.getMap());}}輸出結(jié)果如下:
{key1=value1, key2=value2}在使用clone方法拷貝對(duì)象的時(shí)候引用類(lèi)型的屬性不會(huì)繼續(xù)做拷貝,而是多個(gè)拷貝對(duì)象使用同一個(gè)屬性,這種被稱(chēng)為淺拷貝。
下面對(duì)clone方法重寫(xiě)完成深拷貝:
重新執(zhí)行client輸出結(jié)果為:
{key1=value1}轉(zhuǎn)載于:https://www.cnblogs.com/vitasyuan/p/9569404.html
總結(jié)
以上是生活随笔為你收集整理的设计模式之--原型模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: [Redux/Mobx] Redux中异
- 下一篇: 深度学习算法-YOLO