怎么用ps做靜態(tài)網(wǎng)站管理培訓(xùn)
一.原型模式
- 通過 n e w 產(chǎn)生一個對象需要非常繁瑣的數(shù)據(jù)準(zhǔn)備或訪問權(quán)限,則可以使用原型模式。 \color{red}{通過new產(chǎn)生一個對象需要非常繁瑣的數(shù)據(jù)準(zhǔn)備或訪問權(quán)限,則可以使用原型模式。} 通過new產(chǎn)生一個對象需要非常繁瑣的數(shù)據(jù)準(zhǔn)備或訪問權(quán)限,則可以使用原型模式。
- 就是java中的克隆技術(shù),以某個對象為原型,復(fù)雜出新的對象。顯然,新的對象具備原型對象的特點。
- 優(yōu)勢: 效率高(直接克隆,避免了重新執(zhí)行構(gòu)造過程步驟)。
- 克隆類似new,但是不同于new。new創(chuàng)建新的對象屬性采用的是默認(rèn)值??寺〕龅膶ο蟮膶傩灾低耆驮蛯ο笙嗤?。并且克隆出的新對象改變不會影響原型對象。然后,再改變克隆對象的值。
- 原型模式一般很少單獨出現(xiàn),一般是和工廠方法模式一起出現(xiàn),通過 c l o n e 方法創(chuàng)建一個對象,然后由工廠方法提供給調(diào)用者。 \color{red}{原型模式一般很少單獨出現(xiàn),一般是和工廠方法模式一起出現(xiàn),通過clone方法創(chuàng)建一個對象,然后由工廠方法提供給調(diào)用者。} 原型模式一般很少單獨出現(xiàn),一般是和工廠方法模式一起出現(xiàn),通過clone方法創(chuàng)建一個對象,然后由工廠方法提供給調(diào)用者。
二.原型模式實現(xiàn)
- cloneable接口和clone方法;
- 利用序列化和反序列化實現(xiàn)深克隆。
三.淺克隆和深克隆
- 所謂淺克隆、深克隆指的是:克隆對象和原型對象屬性對象引用是否同一個,是同一個就是淺克隆,否則就是深克隆。
四.代碼展示
/*** 克隆羊 多利 對象*/
public class Sheep implements Cloneable{private String name;private Date birthday;@Overrideprotected Object clone() throws CloneNotSupportedException {//?直接調(diào)用Object對象的clone()方法Object obj=super.clone(); return obj;}public Sheep() {}public Sheep(String name, Date birthday) {this.name = name;this.birthday = birthday;}public String getName() {return name;}public Date getBirthday() {return birthday;}public void setName(String name) {this.name = name;}public void setBirthday(Date birthday) {this.birthday = birthday;}
}
/*** 原型模式------>淺復(fù)制(淺克隆)*/
public class App {public static void main(String[] args) throws CloneNotSupportedException {Date date=new Date(123123123L);Sheep s1=new Sheep("多利",date);Sheep s2=(Sheep) s1.clone();System.out.println(s1+"\t"+s1.getName()+"---->"+s1.getBirthday());//這里更改后 s2 克隆也相應(yīng)更改date.setTime(321213543123L);System.out.println(s1+"\t"+s1.getName()+"---->"+s1.getBirthday());//可以更改s2的屬性s2.setName("多多利");System.out.println(s2+"\t"+s2.getName()+"---->"+s2.getBirthday());}
}
com.reyco.prototype.Sheep@7852e922 多利---->Fri Jan 02 18:12:03 CST 1970
com.reyco.prototype.Sheep@7852e922 多利---->Fri Mar 07 01:59:03 CST 1980
com.reyco.prototype.Sheep@55f96302 多多利---->Fri Mar 07 01:59:03 CST 1980
/*** 原型模式------>深復(fù)制(深克隆)*/
public class Sheep2 implements Cloneable{private String name;private Date birthday; @Overrideprotected Object clone() throws CloneNotSupportedException {Object obj=super.clone(); //直接調(diào)用Object對象的clone()方法 //添加以下代碼實現(xiàn)深復(fù)制Sheep2 s=(Sheep2) obj; s.birthday=(Date) this.birthday.clone(); return obj;}public Sheep2() {}public Sheep2(String name, Date birthday) {this.name = name;this.birthday = birthday;}public String getName() {return name;}public Date getBirthday() {return birthday;}public void setName(String name) {this.name = name;}public void setBirthday(Date birthday) {this.birthday = birthday;}
}
/*** 原型模式------>深復(fù)制(深克隆)* @author Administrator*/
public class App2 {public static void main(String[] args) throws CloneNotSupportedException {Date date=new Date(123123123L);Sheep2 s=new Sheep2("多利",date);Sheep2 s2=(Sheep2) s.clone();System.out.println(s.getName()+"---->"+s.getBirthday());//這里更改后 s2克隆不會更改date.setTime(321213543123L);System.out.println(s.getName()+"---->"+s.getBirthday());//可以更改s2的屬性s2.setName("多多利");System.out.println(s2.getName()+"---->"+s2.getBirthday());}
}
多利---->Fri Jan 02 18:12:03 CST 1970
多利---->Fri Mar 07 01:59:03 CST 1980
多多利---->Fri Jan 02 18:12:03 CST 1970
五.序列化和反序列化實現(xiàn)深克隆
/*** 序列化和反序列化實現(xiàn)深克隆必須實現(xiàn)Serializable接口*/
public class Sheep implements Serializable{private String name;private Date birthday;public Sheep() {}public Sheep(String name, Date birthday) {this.name = name;this.birthday = birthday;}public String getName() {return name;}public Date getBirthday() {return birthday;}public void setName(String name) {this.name = name;}public void setBirthday(Date birthday) {this.birthday = birthday;}
}public static void main(String[] args) throws Exception {Date date=new Date(123123123L);Sheep s=new Sheep("多利",date);System.out.println(s.getName()+"---->"+s.getBirthday());//使用序列化和反序列化實現(xiàn)深復(fù)制ByteArrayOutputStream bos=new ByteArrayOutputStream();ObjectOutputStream oos=new ObjectOutputStream(bos);oos.writeObject(s);byte[] bytes =bos.toByteArray(); ByteArrayInputStream bis=new ByteArrayInputStream(bytes);ObjectInputStream ois=new ObjectInputStream(bis);Sheep s2=(Sheep) ois.readObject();//這里更改后 s2克隆不會更改date.setTime(321213543123L);System.out.println(s.getName()+"---->"+s.getBirthday());//可以更改s2的屬性s2.setName("多多利");System.out.println(s2.getName()+"---->"+s2.getBirthday());
}
更多設(shè)計模式學(xué)習(xí):
??????????設(shè)計模式(1):介紹
??????????設(shè)計模式(2):單例模式
??????????設(shè)計模式(3):工廠模式
??????????設(shè)計模式(4):建造者模式
??????????設(shè)計模式(6):橋接模式
??????????設(shè)計模式(7):裝飾器模式
??????????設(shè)計模式持續(xù)更新中…