原型模式 Prototype

2022-01-13 02:04:18 字數 1921 閱讀 1045

原型模式是一種建立型設計模式,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章了...