15原型模式(Prototype)
依賴關(guān)系倒置: ???
? ?? ????
動(dòng)機(jī)(Motivate):
??? 在軟件系統(tǒng)中,經(jīng)常面臨著“某些結(jié)構(gòu)復(fù)雜的對(duì)象”的創(chuàng)建工作;由于需求的變化,這些對(duì)象經(jīng)常面臨著
劇烈的變化,但是它們卻擁有比較穩(wěn)定一致的接口。
??? 如何應(yīng)對(duì)這種變化?如何向“客戶程序(使用這些對(duì)象的程序)"隔離出“這些易變對(duì)象”,從而使得“依賴這些易變對(duì)象的客戶程序”不隨著需求改變而改變?
意圖(Intent):
????用原型實(shí)例指定創(chuàng)建對(duì)象的種類,并且通過(guò)拷貝這些原型創(chuàng)建新的對(duì)象。
??? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??? ------《設(shè)計(jì)模式》GOF
結(jié)構(gòu)圖(Struct):
??? ?? ?? ?? ???
生活例子:?
??? ?? ??????
????????????????????
??????????????????????
適用性:
?
? 1.當(dāng)一個(gè)系統(tǒng)應(yīng)該獨(dú)立于它的產(chǎn)品創(chuàng)建,構(gòu)成和表示時(shí);
??? 2.當(dāng)要實(shí)例化的類是在運(yùn)行時(shí)刻指定時(shí),例如,通過(guò)動(dòng)態(tài)裝載;
??? 3.為了避免創(chuàng)建一個(gè)與產(chǎn)品類層次平行的工廠類層次時(shí);
??? 4.當(dāng)一個(gè)類的實(shí)例只能有幾個(gè)不同狀態(tài)組合中的一種時(shí)。建立相應(yīng)數(shù)目的原型并克隆它們可能比每次用合適的狀態(tài)手工實(shí)例化該類更方便一些。
?
示意性代碼例子:
1?public??abstract?class?NormalActor2?????{
3?????????public?abstract?NormalActor?clone();
4?????}
?
1????public?class?NormalActorA:NormalActor2?????{
3????????public?override?NormalActor?clone()
4????????{
5????????????Console.WriteLine("NormalActorA?is?call");
6????????????return?(NormalActor)this.MemberwiseClone();
7????????????
8????????}
9?????}
?
1???public?class?NormalActorB?:NormalActor2?????{
3????????public?override?NormalActor?clone()
4????????{
5????????????Console.WriteLine("NormalActorB??was?called");
6????????????return?(NormalActor)this.MemberwiseClone();
7????????????
8????????}
9?????}
?? public class GameSystem
??? {
?????? public void Run(NormalActor normalActor)
?????? {
?????????? NormalActor normalActor1 = normalActor.clone();
?????????? NormalActor normalActor2 = normalActor.clone();
?????????? NormalActor normalActor3 = normalActor.clone();
?????????? NormalActor normalActor4 = normalActor.clone();
?????????? NormalActor normalActor5 = normalActor.clone();
??????????
?????? }
??? }
?????class Program??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
??? {
??????? static void Main(string[] args)
??????? {
??????????? GameSystem gameSystem = new GameSystem();
?????????? gameSystem.Run(new NormalActorA());
??????? }
??? }
如果又需要?jiǎng)?chuàng)建新的對(duì)象(flyActor),只需創(chuàng)建此抽象類,然后具體類進(jìn)行克隆。
? public abstract class FlyActor
??? {
??????? public abstract FlyActor clone();
??? }
? public? class FlyActorB:FlyActor
??? {
????? /// <summary>
????? /// 淺拷貝,如果用深拷貝,可使用序列化
????? /// </summary>
????? /// <returns></returns>
????? public override FlyActor clone()
????? {
????????? return (FlyActor)this.MemberwiseClone();
????? }
??? }
此時(shí),調(diào)用的Main()函數(shù)只需如下:
?? class Program??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
??? {
??????? static void Main(string[] args)
??????? {
??????????? GameSystem gameSystem = new GameSystem();
?????????? gameSystem.Run(new NormalActorA(), new FlyActorB());
??????? }
??? }
Prototype的幾個(gè)要點(diǎn):
????
??? Prototype模式同樣用于隔離類對(duì)象的使用者和具體類型(易變類)之間的耦合關(guān)系,它同樣要求這
些“易變類”擁有“穩(wěn)定的接口”。
??? Prototype模式對(duì)于“如何創(chuàng)建易變類的實(shí)體對(duì)象“采用“原型克隆”的方法來(lái)做,它使得我們可以
非常靈活地動(dòng)態(tài)創(chuàng)建“擁有某些穩(wěn)定接口中”的新對(duì)象----所需工作僅僅是注冊(cè)的地方不斷地Clone.
??? Prototype模式中的Clone方法可以利用.net中的object類的memberwiseClone()方法或者序列化來(lái)實(shí)現(xiàn)深拷貝。
有關(guān)創(chuàng)建型模式的討論:
??? Singleton模式解決的是實(shí)體對(duì)象個(gè)數(shù)的問(wèn)題。除了Singleton之外,其他創(chuàng)建型模式解決的是都是new 所帶來(lái)的耦合關(guān)系。
??? Factory Method ,Abstract Factory,Builder都需要一個(gè)額外的工廠類來(lái)負(fù)責(zé)實(shí)例化“易變對(duì)象”,而Prototype則是通過(guò)原型(一個(gè)特殊的工廠類)來(lái)克隆“易變對(duì)象”。
??? 如果遇到“易變類”,起初的設(shè)計(jì)通常從Factory Mehtod開始,當(dāng)遇到更多的復(fù)雜變化時(shí),再考慮重重構(gòu)為其他三種工廠模式(Abstract Factory,Builder,Prototype).
總結(jié)
以上是生活随笔為你收集整理的15原型模式(Prototype)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 民生白条联名卡年费是多少
- 下一篇: 33迭代器模式(Iterator Pat