發(fā)文章
發(fā)文工具
撰寫
網(wǎng)文摘手
文檔
視頻
思維導(dǎo)圖
隨筆
相冊(cè)
原創(chuàng)同步助手
其他工具
圖片轉(zhuǎn)文字
文件清理
AI助手
留言交流
在開發(fā)中如果我們希望快速的創(chuàng)建一個(gè)對(duì)象,并且該對(duì)象和原有的對(duì)象擁有相同的數(shù)據(jù),并且和原有的對(duì)象不相干,那么我們就可以這樣做
第一步:
假如我需要快速創(chuàng)建一個(gè)Person對(duì)象,然后和某個(gè)Person對(duì)象相同,如果我們我們只需要Person對(duì)象中的屬性不引用其他數(shù)據(jù)信息,可以使用淺拷貝;
如果我們需要Person對(duì)象中所有的信息,包括引用的數(shù)據(jù)信息,可以使用深拷貝
第二步:
在Person類中實(shí)現(xiàn)Cloneable接口,重寫clone()方法,如果是淺拷貝,只需要直接調(diào)用父類的clone()方法就行,如果是深拷貝,需要在clone()方法中重新開辟引用字段所需的內(nèi)存
代碼如下:
Person.java
package com.designpattern.prototype; import java.util.ArrayList; import java.util.List; public class Person implements Cloneable { private String name; private int age; //朋友 private List<String> friends; public List<String> getFriends() { return friends; } public void setFriends(List<String> friends) { this.friends = friends; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } /** * 實(shí)現(xiàn)淺拷貝 */ // protected Person clone(){ // // try { // return (Person)super.clone(); // } catch (CloneNotSupportedException e) { // e.printStackTrace(); // return null; // } // // } /** * 實(shí)現(xiàn)深拷貝 */ protected Person clone(){ try { List<String> newfriends = new ArrayList<String>(); for (String friend : this.getFriends()) { newfriends.add(friend); } Person person = (Person)super.clone(); person.setFriends(newfriends); return person; } catch (CloneNotSupportedException e) { e.printStackTrace(); return null; } } }
MainClass.java
package com.designpattern.prototype; import java.util.ArrayList; import java.util.List; public class MainClass { public static void main(String[] args) { //假如我需要快速創(chuàng)建一個(gè)Person對(duì)象,然后和某個(gè)Person對(duì)象相同,如果我們我們只需要Person對(duì)象中的屬性不引用其他數(shù)據(jù)信息,可以使用淺拷貝 //如果我們需要Person對(duì)象中所有的信息,包括引用的數(shù)據(jù)信息,可以使用深拷貝 /* * 淺拷貝 */ // Person person = new Person(); // person.setName("jack"); // person.setAge(18); // // Person person2 = person.clone();//相當(dāng)于重新開辟一塊內(nèi)存空間,和person互不干擾 // person2.setName("jack1"); // // System.out.println(person.getName()); // System.out.println(person2.getName()); Person person = new Person(); person.setName("jack"); person.setAge(18); List<String> friends = new ArrayList<String>(); friends.add("p1"); friends.add("p2"); person.setFriends(friends); Person person2 = person.clone(); person2.setName("jack1"); friends.add("p3");//person 引用friends,friends改變,person的friends就會(huì)改變,如果用淺拷貝,person2也會(huì)跟著改變 //如果用深拷貝,person2不會(huì)跟著改變,因?yàn)閜erson2的friends和person的friends沒(méi)有指向同一塊內(nèi)存 System.out.println(person.getName()); System.out.println(person2.getName()); System.out.println(person.getFriends()); System.out.println(person2.getFriends()); } }
一、什么是原型模式
Prototype模式是一種對(duì)象創(chuàng)建型模式,它采取復(fù)制原型對(duì)象的方法來(lái)創(chuàng)建對(duì)象的實(shí)例。使用Prototype模式創(chuàng)建的實(shí)例,具有與原型一樣的數(shù)據(jù)。
二、原型模式的特點(diǎn)
1. 由原型對(duì)象自身創(chuàng)建目標(biāo)對(duì)象。也就是說(shuō),對(duì)象創(chuàng)建這一動(dòng)作發(fā)自原型對(duì)象本身。
2.目標(biāo)對(duì)象是原型對(duì)象的一個(gè)克隆。也就是說(shuō),通過(guò)Prototype模式創(chuàng)建的對(duì)象,不僅僅與原型對(duì)象具有相同的結(jié)構(gòu),還與原型對(duì)象具有相同的值。
3.根據(jù)對(duì)象克隆深度層次的不同,有淺度克隆與深度克隆。
三、原型模式應(yīng)用場(chǎng)景
- 在創(chuàng)建對(duì)象的時(shí)候,我們不只是希望被創(chuàng)建的對(duì)象繼承其基類的基本結(jié)構(gòu),還希望繼承原型對(duì)象的數(shù)據(jù)。
- 希望對(duì)目標(biāo)對(duì)象的修改不影響既有的原型對(duì)象(深度克隆的時(shí)候可以完全互不影響)。
- 隱藏克隆操作的細(xì)節(jié)。很多時(shí)候,對(duì)對(duì)象本身的克隆需要涉及到類本身的數(shù)據(jù)細(xì)節(jié)。
來(lái)自: 昵稱10504424 > 《工作》
0條評(píng)論
發(fā)表
請(qǐng)遵守用戶 評(píng)論公約
設(shè)計(jì)模式之原型模式
public class Sheep {Sheep sheep2 = new Sheep(sheep.getName(), sheep.getAge(), sheep.getColor());Sheep sheep3 = new Sheep(sheep.getName(), sheep.getAge(), sheep.getColor());Sheep sheep4 = ...
原型模式應(yīng)用——展現(xiàn)每日生活
* 如果不是null,則使用dayLift的clone方法產(chǎn)生一個(gè)新對(duì)象并復(fù)制給dayLife對(duì)象,然后返回 */ @Override public DayLife ...
java提高篇(六)-----使用序列化實(shí)現(xiàn)對(duì)象的拷貝
設(shè)計(jì)模式之Prototype(原型)
原型模式定義: 用原型實(shí)例指定創(chuàng)建對(duì)象的種類,并且通過(guò)拷貝這些原型創(chuàng)建新的對(duì)象.
面試官:你知道對(duì)象的克隆原理嗎?
先創(chuàng)建一個(gè)用戶地址類: public class UserAddress implements Cloneable { private int provinceCode; private int c...
原型(Prototype)模式 != Object.clone()
靜態(tài)工廠方法public static PackageInfo clonePackage(String userName)方法根據(jù)原型創(chuàng)建一份拷貝:首先拿出用戶以前的一條數(shù)據(jù),即這句PackageInfo prototype = loadPackageInfo(userName),然后調(diào)用...
創(chuàng)建型-原型模式 ( Prototype Pattern)
System.out.println("RMB: " + rmb1 + " hashcode:" + rmb1.hashCode());rmb1.setOperator(new Operator("張三")); RMB rmb2 = rmb1.clone(); rmb2.setCo...
原型模式(Prototype)解析例子
原型模式(Prototype)解析例子摘要:本文深入淺出的講述了設(shè)計(jì)模式中的原型模式,并給出了簡(jiǎn)單的示例,例子淺顯易懂,并附帶源代碼。例如:...
23種設(shè)計(jì)模式詳解(五)
public class Test { public static void main(String[] args){ State state=new State();public class Prototype implements Clo...
微信掃碼,在手機(jī)上查看選中內(nèi)容