原型模式(prototype):用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。
模板方法模式:定義乙個操作中的演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定步驟。
1.原型模式和模板方法模式比較像,回想起來經常混在一起,所以區分一下。
2.原型模式是先例項化出乙個物件,然後不斷複製這個物件,複製出來的物件可以繼續修改自己這個複製體。
3.模板方法模式是做乙個模板的類,這個類把基礎相同的部分都寫了,每個子類繼承這個類後在填寫自己需要的內容。
4.如果拿試卷來說,原型就是乙份做好的試卷,咱們複製乙份,再改改得數、名字……簡單的修改就ok啦;而模板就是就是乙份給每個人空著答案的一模一樣的卷子,咱們自己寫完之後那才算是乙個成品。總之,乙個是衝著物件去的,乙個衝著類去的。
在用原型模式的時候就會涉及到乙個深複製淺複製的問題。
我們複製原來那個物件然後修改自己的這個副本,但一修改就出現問題了,因為我們複製出來的這個物件和原來那個物件是有公用的部分,這個公用的就是引用。引用本身沒什麼用,就跟乙個超級鏈結的似的,但是我們用的可是超級鏈結的指向的那個東西。但是我們修改的又不是引用,引用一改連引用的物件都找不到了,我們一修改就是修改的引用的物件,那麼一改就全改了。
舉個生活中的例子,我們例項化乙個家庭物件,有(爸爸、媽媽、孩子),我們現在複製是可以的;但是非有人這麼設計:(孩子他爸、媽媽、孩子),孩子他爸是一種關係啊,是乙個指向性的東西,我們可以複製,但我們複製的就是一種關係,它不是實際的我們擁有的(乙個貨真價實的乙個字段,乙個值,就是個引用,乙個鏈結)。從最開始的那個家庭物件指向了乙個爸爸,後面所有的家庭物件都指向了這個爸爸,我們現在是沒辦法修改的。】
這,就是所謂的淺複製,一改全改的淺複製。
深複製的出現解決了這個問題。
有引用就有引用,複製的時候把你引用的物件例項化出來乙個放在我的裡面就好了嘛,完美解決~
模板方法模式就是提供了乙個很好的**復用平台。
說白了,就是程式設計師懶唄(其實這叫智慧型),看到重複出現的**,整個類吧,一繼承就好了。但是好像又不完全一樣,那不一樣的地方就子類實現唄。
和平時郵箱那個模板功能很像,把每次要寫的內容寫好存起來做成乙個模板,每次直接用模板,然後再在上面填點新內容就好了。
開始的一看這兩個模式感覺都是在復用,然後再改改或者是不同的實現。其實還是有區別的,原型針對的還是物件,自己衝著自己複製出來的物件修修改改;而模板針對的是類,他們的層次不一樣。
臨時想到,兩個模式可以一起用。比如乙個導師制定了乙個框架,寫作規範,題目……(這是個模板,是個類),學生每個人都做出不太一樣的文章(這會還是個子類),然後有乙個學生寫的特別好,學術報紙就開始一次次的給他出版列印(這是不斷的例項化),別的學校學生一看,說:我也得交這個作業,天助我也,那份報紙複製一下,改改名字,改改資料(這是原型模式),ok啦
總之,這兩種模式針對的層次不同,實現的功能都是復用。
設計模式 原型 模板方法模式
定義 原型模式 prototype 用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。原型模式其實就是從乙個物件再建立另外乙個可定製的物件,而且不需要知道任何建立的細節。以簡歷 resume 影印為例。程式 如下 using system using system.collection...
設計模式之模板方法設計模式
父類抽象出子類共有的方法,子類實現各自不同的業務。總之就是一種行為有他們共同的方法,只是他們具體的實現不一樣。比如開車這種行為模式,啟動 換擋 踩油門。每種型號品牌的車都有共同的行為,但是不同型號品牌的車的實現方式可能不同,需要每個品牌型號的車自己實現這些功能。這樣的定義上面行為的模式,稱之為模板方...
模板設計模式 PHP設計模式之模板方法模式
模板方法模式,也是我們經常會在不經意間有會用到的模式之一。這個模式是對繼承的最好詮釋。當子類中有重複的動作時,將他們提取出來,放在父類中進行統一的處理,這就是模板方法模式的最簡單通俗的解釋。就像我們平時做專案,每次的專案流程實都差不多,都有調研 開發 測試 部署上線等流程。而具體到每個專案中,這些流...