設計模式之原型設計
阿新 • • 發佈:2021-07-01
-
問題:現在有一隻羊tom,姓名為:tom,年齡為:1,顏色為:白色,請編寫程式建立和tom羊屬性完全相同的10只羊
-
程式碼
//傳統的解決思路:可以使用類圖展示一下
class Sheep{
private String name;
private int age;
private String color;
public Sheep(String name,int age,String color){
super();
this.name=name;
this.age=age;
this.color=color;
}
//編寫setter和getter方法
//編寫toString()
}
//客戶端
public class Test{
public static void main(String[] args){
//傳統方式:
//優點: 比較好理解,簡單易操作
//缺點:1.在建立新的物件的時候,總是需要重新獲取原始物件的屬性,如果建立的物件比較複雜的時候,效率較低 2.總是需要重新初始化物件,而不是動態的獲取物件執行時的狀態,不夠靈活
//改進思路:java中Object類是所有類的根類。Object類提供了一個clone()方法,該方法可以將一個java物件複製一份,但是需要實現clone()方法的java類必須要實現一個介面CloneAble,該介面表示該類可以複製並且具有複製能力-----》原型模式
Sheep sheep=new Sheep("tom",1,"白色");
Sheep sheep1= new Sheep(sheep.getName(),sheep.getAge(),sheep.getColor());
Sheep sheep2= new Sheep(sheep.getName(),sheep.getAge(),sheep.getColor()); Sheep sheep3= new Sheep(sheep.getName(),sheep.getAge(),sheep.getColor());
}
}
} -
原型模式
-
基本介紹
-
原型模式:是指用原型例項指定建立物件的種類,並且通過拷貝這些原型,建立新的物件
-
原型模式是一種建立型模式,允許一個物件再建立另一個可定製物件,無需知道如何建立的細節
-
工作原理:通過一個原型物件傳給那個要發動建立的物件,這個要發動建立的物件通過請求原型物件拷貝他們自己來實施建立,即物件.clone()
-
形象的瞭解:孫悟空拔出猴毛變出其他孫悟空
-
-
程式碼
.//實現cloneable介面。重寫clone()方法
class Sheep implements Cloneable{
private String name;
private int age;
private String color;
public Sheep(String name,int age,String color){
super();
this.name=name;
this.age=age;
this.color=color;
}
//編寫setter和getter方法
//編寫toString()
//重寫clone(),克隆該例項,使用預設的克隆方法老完成
-
原型模式在Spring框架中的使用
-
spring中bean的建立就是使用了原型模式,通過.xml中的bean標籤中的scope屬性設定的prototype
-
-
原型模式中淺拷貝和深拷貝介紹
-
淺拷貝介紹
-
對於資料型別是基本資料型別的成員變數,淺拷貝會直接進行值傳遞,也就是將該屬性值複製一份給新的物件
-
對於資料型別是引用資料型別的成員變數,比如說成員變數是某個陣列、某個類的物件等,那麼淺拷貝會進行引用傳遞,也就是隻將該成員變數的引用值(記憶體地址)複製一份給新的物件。因為兩個物件的該成員變數都指向同一個例項。在這種情況下,在一個物件中修改該成員變數會影響到另一個物件的該成員變數值(程式碼證明)
-
上面所說的克隆羊就是淺拷貝
-
淺拷貝是使用預設的clone()方法來實現的
-
-
深拷貝介紹
-
複製物件的所有基本資料型別的成員變數值
-
為所有引用資料型別的成員變數申請儲存空間,並複製每個引用資料型別成員變數所引用的物件,知道該物件可達的物件。也就是說,物件進行深拷貝要對整個物件進行拷貝
-
深拷貝實現方式
-
重寫clone方法來實現深拷貝
-
通過物件序列化實現深拷貝
-
程式碼實現
//深拷貝實現,實現序列化介面和克隆介面
public class DeepCloneTarget implements Serializable,Clobeable{
private String cloneName;
private String cloneClass;
//全參構造
//重寫clone()方法,因為該類的屬性都是String,因此這裡使用預設的克隆方法
protected Object clone() throws CloneNotSupportedException{
return super.clone();
}
}
//深拷貝原型類
public class DeepProtoType implements Serializable,Conleable{
//方便期間使用public
public String name;
public DeepCloneTarget deepCloneTarget;
//編寫無參構造
//實現深拷貝--方式一:clone方法
-
-
-
-
-