GO設計模式——6、原型模式(創建型)

目錄

原型模式(Prototype Pattern)

優缺點

使用場景

注意事項

代碼實現


原型模式(Prototype Pattern)

????????原型模式(Prototype Pattern)是用于創建重復的對象,同時又能保證性能。這種類型的設計模式屬于創建型模式,它提供了一種創建對象的最佳方式之一。

????????這種模式是實現了一個原型接口,該接口用于創建當前對象的克隆。當直接創建對象的代價比較大時,則采用這種模式。例如,一個對象需要在一個高代價的數據庫操作之后被創建。我們可以緩存該對象,在下一個請求時返回它的克隆,在需要的時候更新數據庫,以此來減少數據庫調用。

優缺點

(1)優點:性能提高,當創建對象需要一系列繁瑣操作的時候,使用原型模式可以提高一定的性能。

(2)缺點:

  • 配備克隆方法需要對類的功能進行通盤考慮,這對于全新的類不是很難,但對于已有的類不一定很容易,特別當一個類引用不支持串行化的間接對象,或者引用含有循環結構的時候。
  • 必須實現 clone()接口。

使用場景

  • 資源優化場景。
  • 類初始化需要消化非常多的資源,這個資源包括數據、硬件資源等。
  • 性能和安全要求的場景。
  • 通過 new 產生一個對象需要非常繁瑣的數據準備或訪問權限,則可以使用原型模式。
  • 一個對象多個修改者的場景。
  • 一個對象需要提供給其他對象訪問,而且各個調用者可能都需要修改其值時,可以考慮使用原型模式拷貝多個對象供調用者使用。
  • 在實際項目中,原型模式很少單獨出現,一般是和工廠方法模式一起出現,通過 clone 的方法創建一個對象,然后由工廠方法提供給調用者。原型模式已經與 Java 融為渾然一體,大家可以隨手拿來使用。

注意事項

???????與通過對一個類進行實例化來構造新對象不同的是,原型模式是通過拷貝一個現有對象生成新對象的。

深拷貝與淺拷貝

GO語言中的傳遞都是值傳遞,傳遞一個對象,就會把對象拷貝一份傳入函數中,傳遞一個指針,就會把指針拷貝一份傳入進去。賦值的時候也是這樣,ptObj := *pt 就會把傳遞的 Prototype 對象拷貝一份,如果是 ptObj := pt 的話,那么拷貝的就是對象的指針了.

而深拷貝和淺拷貝也可以這樣理解:

  • 深拷貝就是拷貝整個對象,源對象和拷貝對象沒有任何關聯,也不會受到任何影響

  • 淺拷貝就是拷貝對象指針,其實是引用地址都一樣,所以屬于牽一發動全身

注意: golang完全是按值傳遞,所以如果深度拷貝的對象中包含有指針的話,那么深度拷貝后,這些指針也會相同,會導致部分數據共享。

代碼實現

package mainimport "fmt"// 簡歷類,里面包含簡歷的基本信息
type Resume struct {name       stringage        int64sex        stringcompany    stringexperience string
}// 設置簡歷個人信息
func (r *Resume) setPersonInfo(name string, age int64, sex string) {r.name = namer.age = ager.sex = sex
}// 設置工作經驗
func (r *Resume) setWorkExperience(company string, experience string) {r.company = companyr.experience = experience
}// 顯示簡歷內容
func (r *Resume) display() {fmt.Printf("名字:%s,性別:%s,年齡:%d,工作單位:%s,工作經驗:%s \n", r.name, r.sex, r.age, r.company, r.experience)
}// 深拷貝,原型模式的核心
func (r *Resume) clone() *Resume {return &Resume{name:       r.name,sex:        r.sex,age:        r.age,company:    r.company,experience: r.experience,}
}
func main() {fmt.Println("---------------------------原簡歷")resume := &Resume{name:       "李哈哈",sex:        "男",age:        10,company:    "*******責任公司",experience: "學武功和劃水、摸魚",}resume.display()fmt.Println("---------------------------簡歷副本")copyResume := resume.clone()copyResume.setPersonInfo("王嘻嘻", 21, "男")copyResume.display()
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/210548.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/210548.shtml
英文地址,請注明出處:http://en.pswp.cn/news/210548.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

m_map導入本地地形數據

m_map繪制地形圖時,雖然自帶有1的地形圖以及從NOAA下載的1分的地形圖(詳見:Matlab下地形圖繪圖包m_map安裝與使用),但有時需要對地形圖分辨率的要求更高,便無法滿足。 此時,需要導入本地地形數…

算法Day22 星南二樓(最長升序子序列)

星南二樓(最長升序子序列) Description Input Output Sample 代碼 import java.util.*;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();int[] grid new int[n];for(int j0;j&l…

selenium火狐避免被檢測向ChartGPT的有效提問

問題描述 當我們問 ChartGPT 如果解決 selenium 被屏蔽問題的時候,它總是回答解決問題的方向,沒有給出具體怎么用代碼實現。 問題原因 1、可能是描述不清晰 沒有告訴GPT使用什么編程語言,沒有說明使用火狐還是谷歌瀏覽器,沒有…

深入解析NK模型:復雜適應性系統的演化之謎

NK模型是一種用于研究復雜適應性系統的數學模型,最初由生物學家 Stuart Kauffman 于1993年提出。這模型的目的是模擬生物進化過程中的復雜性,并通過網絡結構和相互作用來研究解空間的性質。 目錄 一、NK模型介紹1. 模型基礎2. 模型參數3. 適應性函數4..…

ubuntu里安裝docker

1、更新軟件包 在終端中執行以下命令來更新Ubuntu軟件包列表和已安裝軟件的版本: sudo apt update sudo apt upgrade 2、安裝docker依賴 Docker在Ubuntu上依賴一些軟件包。執行以下命令來安裝這些依賴: apt-get install ca-certificates curl gnupg lsb-release 3、添加Do…

postman接口自動化測試

Postman除了前面介紹的一些功能,還有其他一些小功能在日常接口測試或許用得上。今天,我們就來盤點一下,如下所示: 1.數據驅動 ? ? 想要批量執行接口用例,我們一般會將對應的接口用例放在同一個Collection中&#xf…

unity 2d 入門 飛翔小鳥 Cinemachine 鏡頭跟隨小鳥 多邊形碰撞器 解決鏡頭不會穿模問題(十二)

1、安裝 window->package manager 2、創建Cinemachine 右鍵->Cinemachine->2D Carmera 3、創建空對象和多邊形控制器如圖 記得勾選 is Trigger 空對象位置記得要和小鳥保持一致,不然等下寫完腳本后,鏡頭一開始會移動一下 4、將多邊形觸…

代碼隨想錄算法訓練營第四十天|139.單詞拆分,多重背包,背包問題

139. 單詞拆分 - 力扣(LeetCode) 給你一個字符串 s 和一個字符串列表 wordDict 作為字典。請你判斷是否可以利用字典中出現的單詞拼接出 s 。 注意:不要求字典中出現的單詞全部都使用,并且字典中的單詞可以重復使用。 示例 1&a…

【Delphi】FMX開發 ios 和 android 異同點(踩坑記)

目錄 一、前言 二、補充下基礎知識 1. APP程序事件:TApplicationEvent 2. APP內置Web服務器或者UDP服務端或者TCP服務端 三、iOS 和 android 平臺的不同點 1. TApplicationEvent的不同點:以下不同點,請仔細閱讀! 2. APP內置…

AI 繪畫 | Stable Diffusion 人物換臉

前言 這篇文章教會你如何使用Stable Diffusion WEB UI擴展插件ReActor輕松實現圖片中的人物換臉。ReActor 是 Stable Diffusion WebUI 的擴展,它允許在圖像中非常簡單準確地進行人臉替換(人臉交換)。 安裝環境準備 安裝 Visual Studio 2022(例如,社區版本 - 需要此步驟來…

十八、FreeRTOS之FreeRTOS任務通知

本節需要掌握以下內容: 1、任務通知的簡介(了解) 2、任務通知值和通知狀態(熟悉) 3、任務通知相關API函數介紹(熟悉) 4、任務通知模擬信號量實驗(掌握) 5、任務通知…

智能無人零售:革新零售消費體驗的未來

智能無人零售:革新零售消費體驗的未來 在當今數字化時代,智能無人零售正以驚人的速度改變著我們的購物方式和消費體驗。這一新興領域的發展,為消費者帶來了前所未有的便利和個性化選擇。 智能無人零售是指利用先進的智能技術和自動化系統&…

【面試題:對象引用在內存中存在何處?基于何種計算機原理獲取對象的值?】

嗨,小伙伴們!小米在這里啦,今天給大家分享一個超有趣的話題——面試題:對象引用是存在內存哪,基于什么計算機原理獲取對象的值?廢話不多說,讓我們一起深入了解一下這個充滿技術魅力的問題吧&…

Java 安全框架shiro初探之一

1.Java安全框架除了spring家族另一個就是shiro框架 不過最近還有一個國產框架很好用:Sa-Token 添加鏈接描述,想了解的小伙伴可以去look look shiro 官方文檔 (https://shiro.apache.org/) 1. 學習教程 參考 (https://www.w3cschool.cn/shiro/) Apac…

2024濟南大健康展會,第六屆中國國際健康產業博覽會5月舉辦

大力發展全國健康事業 助力健康中國行動戰略 DJK 2024第6屆中國(濟南)國際大健康產業博覽會 The 2024 sixth China (Jinan) International Big Health Industry Expo 時間:2024年05月27日—29日 場館:中國濟南黃河國際會展中心 …

java中實現線程池的方式有哪些?

在 Java 中,實現線程池的方式主要有兩種: ThreadPoolExecutor 類: ThreadPoolExecutor 是 Java 提供的靈活、強大的線程池實現類。通過創建 ThreadPoolExecutor 對象,可以自定義線程池的各種參數,包括核心線程數、最大…

JavaScript-節點操作

節點操作 DOM節點 DOM節點:DOM樹里每一個內容都稱之為節點 節點類型: 元素節點 所有的標簽 比如body、divhtml時跟節點 屬性節點 所有的屬性,比如href 文本節點 所有的文本 其他 查找節點 節點的關系:針對的找親戚返回的都是…

java_springboot_ssm流浪寵物救助報名管理系統

用戶: 注冊登錄 寵物百科:提供一些養寵物的專業知識、養寵前的注意事項等等 寵物信息:包括寵物圖片、品種、性別、年齡、疫苗、領取要求等內容 寵物領養:領養人自己的詳細住址、收入情況、有無養過寵物的記錄(有則出示…

學習Java第64天,請求轉發和響應重定向

請求轉發和響應重定向 概述 什么是請求轉發和響應重定向 請求轉發和響應重定向是web應用中間接訪問項目資源的兩種手段,也是Servlet控制頁面跳轉的兩種手段 請求轉發通過HttpServletRequest實現,響應重定向通過HttpServletResponse實現 請求轉發生活舉例: 張三找李四借錢,李四…

人工智能原理復習--搜索策略(二)

文章目錄 上一篇啟發式搜索與或圖搜索博弈下一篇 上一篇 人工智能原理復習–搜索策略(一) 啟發式搜索 提高一般圖搜索效率的關鍵是優化OPEN表中節點的排序方式 最理想的情況是每次排序OPEN表表首n總在解答路徑上 全局排序–對OPEN表中的所有節點進行…