原型设计模式:创建另一个小车
克隆奇跡多莉
有人記得多莉嗎? 是的,是綿羊,是第一個(gè)被克隆的哺乳動(dòng)物。 好吧,我不想深入研究細(xì)節(jié),但是關(guān)鍵是全部與克隆有關(guān)。 這是關(guān)于創(chuàng)建副本。
原型設(shè)計(jì)模式與這個(gè)現(xiàn)實(shí)示例非常相似。 這是“四個(gè)設(shè)計(jì)模式的幫派”的“創(chuàng)新設(shè)計(jì)模式”系列的另一部分。
因此,此模式通過克隆對象而不是與Factory模式不同的創(chuàng)建來工作。
何時(shí)使用此模式?
- 創(chuàng)建對象的成本是昂貴還是復(fù)雜。
- 嘗試將應(yīng)用程序中的類數(shù)保持在最低限度時(shí)
- 在運(yùn)行時(shí)添加或刪除對象時(shí)
- 當(dāng)客戶端應(yīng)用程序不需要知道對象的創(chuàng)建,組成和表示時(shí)。
- 需要與現(xiàn)有對象相似的對象
原型模式有什么作用?
原型模式允許通過復(fù)制現(xiàn)有實(shí)例來制作新實(shí)例。 原型模式會(huì)導(dǎo)致克隆的對象與原始對象不同。 克隆時(shí),原始狀態(tài)與克隆相同。 之后,每個(gè)對象可以經(jīng)歷狀態(tài)改變。 我們可以修改對象以執(zhí)行不同的事情。 唯一的好處是,客戶端可以在不知道實(shí)例化哪個(gè)特定類的情況下創(chuàng)建新實(shí)例。
結(jié)構(gòu)體:
原型類通過實(shí)現(xiàn)Cloneable接口并使用clone()方法聲明一個(gè)用于克隆自身的接口。 具體的原型實(shí)現(xiàn)用于克隆自身的clone()方法。 客戶端類通過要求Prototype克隆自己而不是使用new關(guān)鍵字來創(chuàng)建一個(gè)新對象。
原型圖案結(jié)構(gòu)
事件流以這樣的方式工作,即原始類(例如A類)已經(jīng)被初始化和實(shí)例化。 這是因?yàn)槲覀儾荒馨丛瓨邮褂每寺 ?我們需要在使用它之前實(shí)例化原始類(A類)。 然后,客戶端向Prototype類請求與A類相同類型的新對象。根據(jù)所需對象類型而定的具體原型通過使用clone()方法克隆自身來提供該對象。
想象一下一個(gè)場景,其中可能存在一些要求,我們必須從后端獲取用戶配置文件數(shù)據(jù)以進(jìn)行多種處理,例如用戶配置文件或角色等,而這些更改不會(huì)經(jīng)常更改。 因此,我們可能不得不使用昂貴的數(shù)據(jù)庫資源,連接和事務(wù)。 在這種情況下,我們可以將數(shù)據(jù)存儲(chǔ)在單個(gè)調(diào)用中,并將其緩存在會(huì)話中以進(jìn)行進(jìn)一步處理。
在上面的示例中,UserProfile對象是將被克隆的主要對象。 UserProfile實(shí)現(xiàn)Cloneable接口。 BankDetails和Identity類繼承自UserProfile類。 這些是具體的原型類。
我們引入了一個(gè)名為UserProfileRegistry的新類,該類可以找到適當(dāng)?shù)腢serProfile實(shí)例,然后將克隆適當(dāng)?shù)胤祷亟o客戶端類。
原型模式示例
要在運(yùn)行時(shí)創(chuàng)建另一個(gè)對象(要克隆的對象的真實(shí)副本)時(shí),需要克隆()一個(gè)對象。 真實(shí)副本意味著新創(chuàng)建的對象的所有屬性應(yīng)與您要克隆的對象相同。 如果可以通過使用new實(shí)例化該類,則將獲得一個(gè)具有所有屬性作為其初始值的Object。 例如,如果您正在設(shè)計(jì)一個(gè)用于執(zhí)行銀行帳戶交易的系統(tǒng),那么您將想要制作一個(gè)保存您的帳戶信息的對象的副本,對其進(jìn)行交易,然后將原始對象替換為修改后的對象。 在這種情況下,您可能希望使用clone()而不是new。
有趣的 一點(diǎn) :
- 創(chuàng)意設(shè)計(jì)模式可以共存,例如,抽象工廠,構(gòu)建器和原型可以在實(shí)現(xiàn)過程中使用單例模式,或者它們也可以單獨(dú)工作。
- 原型模式肯定需要初始化操作,但不需要子類化,但是Factory Method需要子類化,但不需要初始化操作。
- 在銀行交易昂貴的數(shù)據(jù)庫查詢中,這是有利的。 緩存可能會(huì)有所幫助,并且原型模式是對此情況的最佳解決方案,因?yàn)榭梢允褂镁哂秀y行帳戶信息或用戶配置文件信息的對象的副本,對其進(jìn)行事務(wù)處理,然后將原始對象替換為修改后的對象。
- 上面的示例使用了淺克隆方法。 但是,我們也可以通過深度克隆來實(shí)現(xiàn)。 有關(guān)此主題的詳細(xì)說明,請參見我們的文章: 深入研究克隆 。
優(yōu)點(diǎn):
- 隱藏了創(chuàng)建對象的復(fù)雜性。
- 客戶可以在不知道對象類型的情況下獲取新對象。
- 減少子類化。
退稅:
- 使用原型的缺點(diǎn)是復(fù)制對象有時(shí)會(huì)很復(fù)雜。
- 具有循環(huán)引用其他類的類不能真正被克隆。
下載源代碼:
參考: 原型設(shè)計(jì)模式:在Idiotechie博客上,由我們的JCG合作伙伴 Mainak Goswami 創(chuàng)建另一個(gè)小車 。
翻譯自: https://www.javacodegeeks.com/2012/11/prototype-design-pattern-creating-another-dolly.html
總結(jié)
以上是生活随笔為你收集整理的原型设计模式:创建另一个小车的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基金备案通过后备案证明(基金备案通过)
- 下一篇: ddos原理是什么(ddos原理和组成)