原型模式是一種建立型設計模式,prototype模式允許乙個物件再建立另外乙個可定製的物件,根本無需知道任何如何建立的細節,工作原理是:通過將乙個原型物件傳給那個要發動建立的物件,這個要發動建立的物件通過請求原型物件拷貝它們自己來實施建立。
memberwiseclone()
方法是object
物件的淺複製的方法。
public static class client
console.writeline(c.id);
} }public abstract class prototype
public string id
}public abstract prototype clone();
} public class concreteprototype : prototype
public override prototype clone()
}
其實沒必要定義抽象原型物件,如那個類需要具有複製的功能,直接繼承icloneable
介面就可以了
public class concreteprototype : icloneable
}public concreteprototype(string id)
public object clone()
}
以上談論的類中不包含引用型別成員(string
型別除外,因每次操作其實新建乙個物件,可當作值型別處理)。如果包含引用成員,以上為淺複製(即引用成員被物件和複製物件公用)。這是有兩種解決辦法:
通過遞迴物件內引用成員(string
除外)執行clone()
(實現複雜)
通過序列化與反序列化(實現簡單)
通過序列化深度複製物件,假設一person
類物件有一address
型別屬性,address
為引用型別。
public static class prototypeclient
; person p2 = p1.clone() as person;
p2.address.area = "chaoyang";
console.write("\nname:,address", p1.name, p1.address.tostring());
console.write("\nname:,address", p2.name, p2.address.tostring());
} }[serializable]
public class person : icloneable
public address address
public object clone()
}[serializable]
public class address
public string city
public string area
public address(string country, string city, string area)
public override string tostring()
,city:,area:", this.country, this.city, this.area);
} }
在新建乙個物件花費代價比較大時(需要從資料庫或遠端獲取資料等),可以使用原型法建立物件。
在對資料庫中資料修改做日誌時,要求記錄修改前值與修改後值。因為專案通過orm運算元據庫,則可先根據原型建立一物件作為修改前值(如果從資料庫中查詢兩次比較耗時)。
原型模式(ProtoType)
1.目的 當需要從乙個物件copy出另外乙個物件時,可以使用原型模式,本質上是呼叫的copy建構函式 與copy建構函式的區別,可能就是不需要顯示的生成物件,而是通過函式呼叫 2.prototype.h ifndef prototype h define prototype h include in...
Prototype 原型模式
prototype 原型模式 所謂原型模式,就是可以根據乙個原型,快速建立出其拷貝。如 int a 1 int b new int a a cout a endl cout b endl 輸出結果 2 1 上面就使用了原型模式。根據原型a,快速建立出了a的拷貝b。同時,b儲存了a當時的狀態。當a之後...
原型模式 Prototype
用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。原型模式是一種建立型設計模式,它允許乙個物件再建立另外乙個可定製的物件,根本無需知道任何如何建立的細節,工作原理是通過將乙個原型物件傳給那個要發動建立的物件,這個要發動的物件通過請求原型物件拷貝它們自己來實施建立。現實很殘酷,都第9章了...