AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁 > 科技  > 軟件

三言兩語說透設(shè)計模式的藝術(shù)-原型模式

來源: 責(zé)編: 時間:2023-08-09 23:02:39 374觀看
導(dǎo)讀1提升對象創(chuàng)建效率:原型模式的智慧原型模式(Prototype Pattern)是一種創(chuàng)造型設(shè)計模式,其核心思想在于通過復(fù)制“原型”來創(chuàng)建對象,而非直接實例化。在原型模式中,我們首先創(chuàng)造一個原型對象,接著通過對其進(jìn)行復(fù)制,獲得新的實例

1提升對象創(chuàng)建效率:原型模式的智慧

原型模式(Prototype Pattern)是一種創(chuàng)造型設(shè)計模式,其核心思想在于通過復(fù)制“原型”來創(chuàng)建對象,而非直接實例化。在原型模式中,我們首先創(chuàng)造一個原型對象,接著通過對其進(jìn)行復(fù)制,獲得新的實例。這些原型對象儲存在一個共享的“原型管理器”中,當(dāng)需要新的對象時,只需從管理器獲取原型的復(fù)制。SIg28資訊網(wǎng)——每日最新資訊28at.com

2原型模式的實現(xiàn)

讓我們以一個具體場景為例,考慮開發(fā)一個鴨子養(yǎng)殖游戲。游戲中需要生成兩種鴨子:北京鴨和綠頭鴨。這兩種鴨子共享一些屬性和方法,如叫聲、游泳和渲染模型,但叫聲和渲染模型是不同的。SIg28資訊網(wǎng)——每日最新資訊28at.com

如果每次都從頭創(chuàng)建鴨子對象,將會產(chǎn)生大量冗余代碼,如下所示:SIg28資訊網(wǎng)——每日最新資訊28at.com

const duck1 = {  name: '鴨子1',  quack() {},  swim() {},  render() {}};const duck2 = {  name: '鴨子2',  quack() {},  swim() {},  render() {}};

這種方式重復(fù)定義相同的 quack 和 swim 方法,效率低下。如果使用簡單工廠模式,代碼如下:SIg28資訊網(wǎng)——每日最新資訊28at.com

function createDuck(type) {  let duck;  if (type === 'beijing') {    duck = new BeijingDuck();   } else if (type === 'greenheaded') {    duck = new GreenHeadedDuck();  }  duck.swim = function() {    console.log('swimming...');  }    duck.render = function() {     console.log('render duck model...')  }  return duck; }const beijingDuck = createDuck('beijing'); const greenDuck = createDuck('greenheaded');

但是,這樣每次創(chuàng)建鴨子對象都需要重新定義 swim 和 render 方法,不夠高效。SIg28資訊網(wǎng)——每日最新資訊28at.com

更優(yōu)雅的方式是將共有部分提取為一個原型:SIg28資訊網(wǎng)——每日最新資訊28at.com

// 鴨子原型const DuckPrototype = {  swim() {},  render() {} };// 創(chuàng)建具體鴨子時復(fù)制原型function createBeijingDuck() {  const duck = Object.create(DuckPrototype);    duck.quack = function() {}    return duck;}function createGreenDuck() {  const duck = Object.create(DuckPrototype);  duck.quack = function() {}      return duck; }

以上代碼展示了如何在鴨子游戲中應(yīng)用原型模式。通過原型模式,我們只需定義一次共有屬性和方法,然后通過復(fù)制原型來實例化新對象。這避免了重復(fù)代碼,提高了對象創(chuàng)建效率,并建立了對象之間的關(guān)系,方便基于原型進(jìn)行擴(kuò)展。SIg28資訊網(wǎng)——每日最新資訊28at.com

原型模式與相關(guān)模式的區(qū)別:SIg28資訊網(wǎng)——每日最新資訊28at.com

  • 在工廠方法模式中,對象創(chuàng)建邏輯在工廠內(nèi)部,而原型模式通過復(fù)制原型來創(chuàng)建對象。
  • 單例模式生成唯一實例,而原型模式可以生成多個相似實例。
  • 建造者模式適用于創(chuàng)建過程復(fù)雜的對象,而原型模式適用于對象實例化復(fù)雜的情況。

那么,如何使用 TypeScript 實現(xiàn)更優(yōu)雅的原型模式呢?SIg28資訊網(wǎng)——每日最新資訊28at.com

// 原型接口interface Prototype {  clone(): Prototype; }// 原型管理器類class PrototypeManager {  private prototypes: {[key: string]: Prototype} = {};  // 省略方法定義}// 具體原型類class ConcretePrototype implements Prototype {  clone() {    return Object.create(this);  }}// 使用// 初始化原型管理器const manager = new PrototypeManager();// 設(shè)置原型對象manager.set('proto', new ConcretePrototype());  // 請求原型復(fù)制實例化const prototypeInstance = manager.get('proto').clone();

以上代碼定義了原型接口、原型管理器類和具體原型類,還提供了簡單的使用示例。從示例中可以看出,原型模式的關(guān)鍵是通過原型管理器來復(fù)制原型對象從而創(chuàng)建實例。SIg28資訊網(wǎng)——每日最新資訊28at.com

3原型模式的優(yōu)缺點(diǎn)

原型模式的主要優(yōu)點(diǎn)包括:SIg28資訊網(wǎng)——每日最新資訊28at.com

  • 提高實例化對象的效率:通過復(fù)制原型對象,避免了重復(fù)的初始化操作。
  • 隱藏實例化的復(fù)雜度:客戶端不需要了解具體的對象創(chuàng)建過程,只需請求原型的復(fù)制即可。
  • 避免構(gòu)造函數(shù)污染:由于實例化是通過復(fù)制原型對象實現(xiàn)的,無需向構(gòu)造函數(shù)中添加不必要的代碼。
  • 動態(tài)添加和刪除原型:可以在運(yùn)行時擴(kuò)展或減少原型對象,客戶端可以直接使用新增的原型來實例化對象。

原型模式的缺點(diǎn)包括:SIg28資訊網(wǎng)——每日最新資訊28at.com

  • 需要定義接口并確保每個具體原型類都實現(xiàn)了該接口,增加了一定的開發(fā)成本。
  • 需要注意原型實例和原型之間的關(guān)系,例如修改原型會影響到其他實例。

4應(yīng)用場景

原型模式在以下場景中常見應(yīng)用:SIg28資訊網(wǎng)——每日最新資訊28at.com

  • 對象創(chuàng)建成本較高:通過復(fù)制原型來提高效率,例如在游戲中創(chuàng)建怪物對象。
  • 系統(tǒng)需要產(chǎn)生預(yù)定義原型的實例:例如用于測試的假日期對象或假支付賬單對象。
  • 類的初始化需要參數(shù):通過原型模式避免構(gòu)造函數(shù)過于復(fù)雜。
  • 需要動態(tài)地創(chuàng)建復(fù)雜對象:客戶端只需要關(guān)注如何獲取對象,無需了解具體創(chuàng)建過程。

以下是一些建議,在前端開發(fā)中更適合使用原型模式的情況:SIg28資訊網(wǎng)——每日最新資訊28at.com

1)創(chuàng)建組件類的原型:通過創(chuàng)建組件類的原型對象,使用 Object.create() 方法基于該原型快速創(chuàng)建組件實例,從而避免重復(fù)編寫組件邏輯。SIg28資訊網(wǎng)——每日最新資訊28at.com

// 原型類const ComponentPrototype = {  // 組件邏輯  render() {    // ...  }};// 基于原型創(chuàng)建實例 const ComponentInstance = Object.create(ComponentPrototype);

2)復(fù)用和配置原型對象:設(shè)計一些可配置的原型對象,如 API 配置對象,然后復(fù)制和配置這些原型來生成不同的實例,避免重復(fù)創(chuàng)建。SIg28資訊網(wǎng)——每日最新資訊28at.com

// 可配置的原型const APIConfigPrototype = {  baseURL: 'https://example.com',  timeout: 1000,};// 復(fù)制原型并配置生成實例const config = Object.assign({}, APIConfigPrototype, {  timeout: 3000  });

3)代理原型對象:通過原型對象實現(xiàn)代理,避免每次訪問都重新創(chuàng)建目標(biāo)對象。SIg28資訊網(wǎng)——每日最新資訊28at.com

// 原型作為代理對象const proxyPrototype = {  target: null,  get(key) {    // 懶加載    if (!this.target) {      this.target = createTargetObject();     }    return this.target[key];  }}// 使用代理原型 const proxy = Object.create(proxyPrototype);proxy.foo // 觸發(fā)代理邏輯

5原型模式與 JavaScript 中的 Prototype

原型模式和 JavaScript 中的原型繼承(prototype)存在以下主要區(qū)別:SIg28資訊網(wǎng)——每日最新資訊28at.com

  • 原型模式是一種設(shè)計模式,是抽象的概念,而 JavaScript 中的 prototype 是一種具體的繼承實現(xiàn)機(jī)制。
  • 原型模式的核心在于原型管理器,用于存儲和管理不同的原型對象。而 JavaScript 中的 prototype 屬性是函數(shù)的一個屬性,指向包含由該函數(shù)創(chuàng)建的對象共享的屬性和方法的對象。
  • 原型模式通過復(fù)制原型對象來創(chuàng)建新的實例,原型與實例之間沒有必然的關(guān)系。而 JavaScript 中的原型繼承是建立原型和實例之間的關(guān)系,實例通過 proto 屬性關(guān)聯(lián)到原型,可以直接訪問原型的屬性和方法。
  • 原型模式可以創(chuàng)建多個相似的對象實例,是一種對象復(fù)用的方式。而 JavaScript 中的原型繼承是實現(xiàn)類繼承的方式,通過 prototype 屬性建立原型鏈,主要用于實現(xiàn)對象的繼承和復(fù)用。
  • 原型模式中,原型對象和實例對象通常相互隔離,修改實例不會影響到原型。而在 JavaScript 原型繼承中,修改原型會影響到所有實例,因為實例引用了原型。
  • 原型模式可以動態(tài)注冊和刪除原型,而 JavaScript 中的原型關(guān)系是在首次實例化時建立的,之后不可更改。

綜上所述,原型模式是一種更抽象和全面的對象復(fù)用方式,而 JavaScript 中的原型繼承只是一種具體的繼承實現(xiàn)方式,它們在核心思想上有所不同。然而,它們在提高實例化效率方面具有一定的相似性。SIg28資訊網(wǎng)——每日最新資訊28at.com

6總結(jié)

原型模式是一種創(chuàng)造型設(shè)計模式,通過復(fù)制現(xiàn)有對象的原型來創(chuàng)建新對象,提高對象創(chuàng)建效率和復(fù)用性。核心思想是在一個原型對象的基礎(chǔ)上,通過復(fù)制來生成新實例,避免重復(fù)初始化。SIg28資訊網(wǎng)——每日最新資訊28at.com

在實際開發(fā)中,原型模式優(yōu)化對象創(chuàng)建,通過共享原型對象避免重復(fù)定義屬性和方法,提高代碼效率。例如,前端可用于創(chuàng)建組件實例,避免重復(fù)編寫組件邏輯。SIg28資訊網(wǎng)——每日最新資訊28at.com

實現(xiàn)原型模式包括創(chuàng)建原型對象,然后通過復(fù)制原型創(chuàng)建新實例。原型對象通常存儲于原型管理器中,供需要創(chuàng)建對象時復(fù)制使用。SIg28資訊網(wǎng)——每日最新資訊28at.com

與JavaScript的原型繼承不同,原型模式更抽象靈活。它動態(tài)添加刪除原型,避免構(gòu)造函數(shù)污染,隱藏實例化復(fù)雜性。注意每具體原型需實現(xiàn)接口,增加開發(fā)成本。SIg28資訊網(wǎng)——每日最新資訊28at.com

總之,原型模式通過復(fù)制對象的原型創(chuàng)建新對象,提高對象創(chuàng)建效率和復(fù)用性。頻繁創(chuàng)建相似對象場景下,原型模式是有用設(shè)計模式。SIg28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-5142-0.html三言兩語說透設(shè)計模式的藝術(shù)-原型模式

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Rust“巨坑”?真相來了!

下一篇: 字節(jié)客戶端也瘋狂拷打基礎(chǔ)!

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 天貓精靈Sound Pro體驗:智能音箱沒有音質(zhì)?來聽聽我的

    這幾年除了手機(jī)作為智能生活終端最主要的核心之外,第二個可以成為中心點(diǎn)的產(chǎn)品是什么?——是智能音箱。 手機(jī)在執(zhí)行命令的時候有兩種操作方式,手和智能語音助手,而智能音箱只
  • 8月總票房已突破10億!《封神》第一:口碑已經(jīng)成了

    8月5日消息,據(jù)燈塔專業(yè)版數(shù)據(jù),截至8月5日9時35分,8月總票房(含預(yù)售)已突破10億。其中,《封神》以大比分的優(yōu)勢領(lǐng)先。根據(jù)官方消息,目前該片總票房已經(jīng)超過14.
  • 量化指標(biāo)是與非:挽救被量化指標(biāo)扼殺的技術(shù)團(tuán)隊

    作者 | 劉新翠整理 | 徐杰承本文整理自快狗打車技術(shù)總監(jiān)劉新翠在WOT2023大會上的主題分享,更多精彩內(nèi)容及現(xiàn)場PPT,請關(guān)注51CTO技術(shù)棧公眾號,發(fā)消息【W(wǎng)OT2023PPT】即可直接領(lǐng)取
  • JavaScript學(xué)習(xí) -AES加密算法

    引言在當(dāng)今數(shù)字化時代,前端應(yīng)用程序扮演著重要角色,用戶的敏感數(shù)據(jù)經(jīng)常在前端進(jìn)行加密和解密操作。然而,這樣的操作在網(wǎng)絡(luò)傳輸和存儲中可能會受到惡意攻擊的威脅。為了確保數(shù)據(jù)
  • 虛擬鍵盤 API 的妙用

    你是否在遇到過這樣的問題:移動設(shè)備上有一個固定元素,當(dāng)激活虛擬鍵盤時,該元素被隱藏在了鍵盤下方?多年來,這一直是 Web 上的默認(rèn)行為,在本文中,我們將探討這個問題、為什么會發(fā)生
  • 使用AIGC工具提升安全工作效率

    在日常工作中,安全人員可能會涉及各種各樣的安全任務(wù),包括但不限于:開發(fā)某些安全工具的插件,滿足自己特定的安全需求;自定義github搜索工具,快速查找所需的安全資料、漏洞poc、exp
  • 拼多多APP上線本地生活入口,群雄逐鹿萬億市場

    Tech星球(微信ID:tech618)文 | 陳橋輝 Tech星球獨(dú)家獲悉,拼多多在其APP內(nèi)上線了“本地生活”入口,位置較深,位于首頁的“充值中心”內(nèi),目前主要售賣美食相關(guān)的
  • AI芯片初創(chuàng)公司Tenstorrent獲三星和現(xiàn)代1億美元投資

    Tenstorrent是一家由芯片行業(yè)資深人士Jim Keller領(lǐng)導(dǎo)的加拿大初創(chuàng)公司,專注于開發(fā)人工智能芯片,該公司周三表示,已經(jīng)從現(xiàn)代汽車集團(tuán)和三星投資基金等
  • 支持aptX Lossless無損傳輸 iQOO TWS 1賽道版發(fā)布限時優(yōu)惠價369元

    2023年7月4日,“無損音質(zhì),聲動人心”iQOO TWS 1正式發(fā)布,支持aptX Lossless無損傳輸,限時優(yōu)惠價369元。iQOO TWS 1耳機(jī)率先支持端到端aptX Lossless無
Top