深入理解JavaScript設計模式之原型模式

目錄

    • 前言引入原型模式
      • 頭腦風暴
      • 傳統方式 vs 原型模式
      • 實戰案例:飛機大戰中的分身術
    • 原型模式實現的關鍵秘密
      • 實戰演練:造一架能分身的飛機
      • 克隆是創建對象的手段
      • 原型模式:輕裝上陣的造物術
    • 原型編程范型的一些規則
        • 原型編程的四大門規:不會就問“我爹”
      • 原型編程的四大鐵律(門規)
        • 所有數據都是對象
        • 想要新對象?別 new 類了,找個原型克隆一份!
        • 對象會記得它的“親爹”是誰(原型)
        • 如果對象不會干某件事,它會把任務交給它的“原型爸爸”
    • JavaScript中的原型繼承
      • 1?? 所有的數據都是對象(或接近)
      • 2?? 要得到一個對象,不是通過實例化類,而是找到一個對象作為原型并克隆它
      • 3?? 對象會記住它的原型
      • 4?? 如果對象無法響應某個請求,它會把這個請求委托給它的構造器的原型
    • 結語:

前言引入原型模式

本文的內容深受《JavaScript設計模式》一書的啟發,特別是關于原型模式的討論,該書深入淺出地介紹了這一重要的設計模式及其在JavaScript語言中的實現。原型模式不僅是眾多設計模式中的一員,它更是構建JavaScript這門語言基礎的核心之一。通過這本書,我們得以從更加簡單的Io語言入手,逐步理解原型模式的概念,并學習如何在JavaScript中應用這一模式來創建強大而靈活的對象系統。
加之在面試過程中,對原型,原型鏈,圓形模式都很模糊,對《JavaScript設計模式》書中的原型模式進行深入反復學習將定義及理論理變為自己的語言重新組織輸出。

頭腦風暴

想象一下,你是一個程序員界的“Ctrl+C / Ctrl+V”大師。你不想每次都重新寫代碼,也不想手動配置一堆參數。你只想——一鍵克隆,天下我有!這,就是我們今天要說的主角:原型模式(Prototype Pattern)。

它不只是設計模式,它是一種編程哲學!
原型模式不僅僅是一個設計模式,它還是一個“編程泛型”級別的存在。你可以把它理解為:

“別跟我說什么類、繼承、new 對象那一套,給我一個樣板,我能克隆出一整個世界。”

從設計模式的角度來看,原型模式的核心思想是:與其造個類慢慢 new,不如找個現成的,咔嚓一下,直接復制一份!

傳統方式 vs 原型模式

通常我們要創建一個對象,得先定義一個類,然后 new出來一個實例。比如:

let plane = new FighterPlane("紅色", 100, "高級炮彈", 50);

這看起來很標準,但問題是:如果你想造一個跟這個飛機一模一樣的分身呢?血量、武器、防御值、皮膚顏色……都得一個個手動傳進去?那不是要命嗎?你是寫代碼的,又不是在填表格!這時候,原型模式就閃亮登場了!原型模式是怎么干的?
原型模式說:

“嘿,別整這些麻煩事了。你不是已經有一個完美的飛機了嗎?拿它當模板,克隆一個不就完了?”

于是你就調用了一個方法,比如:

let clonePlane = originalPlane.clone();

一句話搞定,啥都不用管。原飛機有什么屬性,新飛機就自動擁有,連它的“壞脾氣”都一起復制過去了!

實戰案例:飛機大戰中的分身術

假設你在開發一款網頁游戲《飛機大戰》,某個 boss 飛機突然大喊一聲:“我要分身!”,你是不是得手忙腳亂地記下它當前的血量、攻擊力、裝備等級、飛行姿勢……然后再 new 出一個一樣的?不用了!現在只要一句:

let 分身 = 真身.clone();

克隆出來的分身不僅長得像,連戰斗狀態都同步了。真·完美復制!如果使用原型模式,我們只需要調用負責克隆的方法,便能完成同樣的功能。

原型模式實現的關鍵秘密

通過上面講解你還以為程序員只會 new 對象?不不不,我們還有更高級的操作——復制粘貼對象!
而實現這個魔法的關鍵,就是看語言有沒有提供一個叫 .clone() 的方法。可惜的是,JavaScript 并沒有原生的 .clone() 方法(別哭別沮喪,JS本來就不是那種貼心暖男型又或者貼心鄰家大姐姐語言),但它給了我們另一個工具箱里的神器:Object.create(),這玩意兒就像是 JavaScript 界的“克隆羊多利”,只要你給它一個“母體對象”,它就能給你造出一個一模一樣的副本!

實戰演練:造一架能分身的飛機

讓我們來看一段代碼,看看怎么用 Object.create() 把飛機克隆出來!

	var Plane = function() { this.blood = 100; this.attackLevel = 1; this.defenseLevel = 1; }; var plane = new Plane(); plane.blood = 500; plane.attackLevel = 10; plane.defenseLevel = 7;

這段代碼干了啥?你可以理解為:我們先 new 出了一個基礎版小破飛機,然后給它加了個 buff,血量 +400,攻擊力 +9,防御力也猛漲。現在它已經是一架“戰神級飛機”了!那問題來了:你想再搞一架一模一樣的飛機怎么辦?難道要重新 new,再一個個屬性設置一遍?太麻煩了!這時候,就該請出我們的主角登場了:💥 克隆大法好!

var clonePlane = Object.create(plane);

一句話,搞定克隆!就像你拿著這架飛機去復印店說:“老板,來一份復印件,不要改樣式,我要原樣再來一份。”于是你就得到了一架新的飛機,連它的“戰斗狀態”都一毛一樣:

console.log(clonePlane); // 輸出:Object {blood: 500, attackLevel: 10, defenseLevel: 7}

但是捏,老舊瀏覽器怎么辦?有困難就解決困難!發動手動縫合克隆術!但總有那么幾個“古董級瀏覽器”,比如IE8及以下,它們一臉懵逼地說:“什么?Object.create 是個啥?”,那怎么辦?別慌,我們可以自己寫一個“土法”克隆術:

Object.create = Object.create || function(obj) {var F = function() {};F.prototype = obj;return new F();
}

這相當于你在對瀏覽器說:

“既然你不支持克隆技術,那我就自己搭個克隆實驗室!用 prototype 搞點遺傳工程,照樣能造出一模一樣的飛機!”

雖然看起來有點土,但效果一樣頂呱呱!

克隆是創建對象的手段

通過上面飛機分身復制術,你以為原型模式只是個“復制粘貼工具人”?錯!它真正的身份是——宇宙造物主級別的對象工廠!別看它表面是在“克隆”,其實它心里想的是:

“我不只是在復制一個對象,我是在幫你創建一個新的世界。”

🤔 克隆只是手段,造對象才是目的!就像你去餐廳點了一份紅燒肉,廚師說:“哎呀今天沒肉了,我就給你端了一盤一模一樣的昨天剩菜。”雖然看起來一樣,但本質不一樣!

原型模式也是一樣:

表面上看:它在“復制”一個對象。
實際上:它是在用“復制”這種方式,來創建一個新對象。

換句話說:克隆只是過程,不是目的。就像洗澡是為了干凈,不是為了泡水。

💼 舉個 Java 程序員的苦逼例子
Java 這種“類型潔癖癥晚期”語言中,寫代碼就像是在做數學證明題:類型必須嚴格匹配,創建對象要 new 某個具體的類名,如果你想換實現?不好意思,得改代碼、加依賴、重新編譯……,這時候設計模式就站出來說話了:

“兄弟,咱們得解耦啊!”

“不能直接 new 對象,得搞個工廠出來!”

于是就有了:

工廠方法模式(Factory Method)
抽象工廠模式(Abstract Factory)

結果呢?本來只是想造一架飛機,現在還得先建個“飛機制造工廠公司集團有限公司”。更慘的是,每個飛機型號都得配一個對應的工廠……這代碼量,簡直爆炸!

原型模式:輕裝上陣的造物術

這時候原型模式閃亮登場了,它甩掉所有繁瑣的類和工廠,只說一句話:

“別整那些虛的,給我一個樣板,我能造出一個一模一樣的。”

這就像一個小女孩指著商店里的玩具飛機說:

“我要這個!”

而不是說:

“我要一個飛行器,材質塑料,動力系統為螺旋槳驅動,翼展15cm……”

她不懂那么多術語,但她知道:這個就是我要的對象!所以,原型模式的本質是:

? 不需要知道具體類名
? 不需要 new 出來一堆耦合
? 只要有一個對象,就能作為模板,輕松造出新的對象!

當然啦,在 JavaScript 的世界里,這一切變得更加絲滑。因為 JS 本身就是基于原型的語言,它不靠“類”來創建對象,而是靠“原型鏈”來繼承屬性。你可以理解為:JS 的對象系統,就是用原型模式搭起來的。所以從這個角度講,在 JavaScript 中使用原型模式,有點像是:

“給貓裝胡須,給魚裝鰓,給程序員發咖啡。”

已經自帶技能了好嗎!不過,如果你真要用原型模式來做業務邏輯上的對象創建,也不是不行。比如:

let plane = { blood: 500,attackLevel: 10,defenseLevel: 7,fire: function() {console.log("發射導彈!");}
};
let clonePlane = Object.create(plane);
clonePlane.name = "分身一號";

你看,不需要 new Plane(),也不需要寫構造函數,只要有個原型對象,就可以直接克隆出一個新對象。是不是很像魔法?是不是比寫一堆 classfactory 干凈多了?

📚 總結一下:原型模式到底圖啥?

傳統模式原型模式
new XXX(),依賴具體類克隆已有對象,不關心類名
需要工廠類支持一行代碼搞定
容易耦合更加靈活

原型編程范型的一些規則

原型編程的四大門規:不會就問“我爹”

JavaScript 的江湖里,有個神秘的門派叫——原型宗(Prototype Sect)。這個門派不講“類”,不搞“繼承”,他們只信奉一個真理:

“不會?沒問題,去問你爹。”

這,就是我們今天要說的——原型編程范型的基本規則。

原型編程的四大鐵律(門規)

所有數據都是對象

沒錯,在這里沒有“原始類型”這種說法,哪怕是數字、字符串,都被當作“對象小弟”來看待。你可以理解為:在原型宗的地盤上,連數字都想當大哥。

let x = 5;
x.isAlsoAnObject = true; // 雖然 JS 會臨時包裝成對象,但意思到了就行 😄
想要新對象?別 new 類了,找個原型克隆一份!

別人創建對象靠 new Plane(),原型宗靠“復印機”。只要找到一個現成的對象作為“模板”,輕輕一按:
“Ctrl+CCtrl+V,一個一模一樣的飛機就出來了。”

let plane = { blood: 500, attackLevel: 10 };
let clonePlane = Object.create(plane);

一句話搞定,啥都不用寫!

對象會記得它的“親爹”是誰(原型)

每個對象心里都清楚,自己是從哪個原型克隆來的。就像孩子知道自己老爸是誰一樣,JS 中的對象也有一條“血緣鏈”——原型鏈(Prototype Chain)你雖然沒有顯式地聲明繼承關系,但它默默地記住了它的“原型爸爸”。

如果對象不會干某件事,它會把任務交給它的“原型爸爸”

這是原型宗最核心的一句話:

“我不行?沒關系,我爹行!”

比如你想讓一個對象執行某個方法,它自己沒這個技能,它就會順著原型鏈往上找:

自己有沒有?沒有。
爸爸有沒有?有!借來用!

這就叫做:委托機制(Delegation

let dog = {bark: function() {console.log("汪汪汪!");}
};
let buddy = Object.create(dog);
buddy.bark(); // 輸出:"汪汪汪!",雖然 buddy 自己沒定義這個方法

🧾 總結一下:原型宗四大門規

規則編號內容描述解釋
Rule 1所有數據都是對象數字也會裝逼說自己是對象
Rule 2得到對象靠克隆原型,不是靠 new 類 不寫構造函數只管復制粘貼
Rule 3對象知道自己的原型是誰孩子知道自己老爸是誰
Rule 4請求失敗時,委托給原型處理 自己不會?去找你爹!

JavaScript中的原型繼承

JavaScript 的世界里,沒有 Java 那種“類”的概念,它走的是另一條路——原型編程(Prototype-based Programming)。這就像:別人靠“父母”生孩子,JS 靠“克隆”造對象。現在我們就來看看 JavaScript 是如何通過原型鏈實現對象之間的繼承關系的。

1?? 所有的數據都是對象(或接近)

JavaScript 在設計之初模仿了 Java,引入了兩套類型機制:基本類型對象類型。基本類型包括 undefinednumberbooleanstringfunctionobject。但說實話,這種設計有點迷糊。按照 JS 設計者的初衷,除了 undefined 外,其他一切都是對象。為了讓 numberbooleanstring 這些基本類型也能像對象一樣被處理,JS 引入了“包裝類”。雖然不能說所有數據都是對象,但可以說絕大部分數據是對象。而且,在 JavaScript 中有一個根對象存在,那就是 Object.prototype。它是所有對象的老祖宗,所有對象追根溯源都來源于這個根對象。

比如下面的例子:

var obj1 = new Object(); 
var obj/XMLSchema = {};
console.log(Object.getPrototypeOf(obj1) === Object.prototype); // 輸出:true 
console.log(Object.getPrototypeOf(obj2) === Object.prototype); // 輸出:true 

這就像是所有的對象都認同一個老祖宗——Object.prototype

2?? 要得到一個對象,不是通過實例化類,而是找到一個對象作為原型并克隆它

JavaScript 中,我們并不需要關心克隆一個對象的這些細節,因為這是引擎內部的事兒。當我們調用 new Object() 或者 {}來創建對象時,引擎會從 Object.prototype 上面克隆出一個新的對象。再來看個例子:

	function Person(name) { this.name = name; }Person.prototype.getName = function() { return this.name; };var a = new Person('sven');console.log(a.name); // 輸出:sven console.log(a.getName()); // 輸出:sven console.log(Object.getPrototypeOf(a) === Person.prototype); // 輸出:true 

x
雖然我們用了 new 關鍵字,但其實并沒有真正意義上的“類”,Person 只是個構造器。使用 new 創建對象的過程,實際上也只是先克隆 Object.prototype 對象,再進行一些額外操作。

3?? 對象會記住它的原型

每個對象都記得自己的“親爹”是誰(即它的原型)。為了實現這一點,JavaScript 給對象提供了一個隱藏屬性——__proto__。這個屬性指向對象的構造器的原型對象 {Constructor}.prototype

例如:

var a = new Object();
console.log(a.__proto__ === Object.prototype); // 輸出:true 

這就像是對象之間有一條看不見的線,把它們串在一起。當我們用new創建對象時,需要手動設置 obj.__proto__ = Constructor.prototype,這樣才能讓對象正確地找到它的“親爹”。

4?? 如果對象無法響應某個請求,它會把這個請求委托給它的構造器的原型

這條規則就是原型繼承的精髓所在。當一個對象無法響應某個請求時,它會順著原型鏈把請求傳遞下去,直到遇到一個能處理該請求的對象為止。

舉個例子:

var obj = { name: 'sven' }; 
var A = function(){}; 
A.prototype = obj; 
var a = new A(); 
console.log(a.name); // 輸出:sven 

在這個過程中,如果對象 a 沒有找到 name 屬性,它就會沿著原型鏈向上查找,直到在 obj 中找到了name 屬性,并返回其值。再看一個稍微復雜一點的例子:

var A = function(){}; 
A.prototype = { name: 'sven' }; 
var B = function(){}; 
B.prototype = new A(); 
var b = new B(); 
console.log(b.name); // 輸出:sven 

當嘗試訪問 bname 屬性時,如果 b 自己沒有這個屬性,它會沿著原型鏈向上查找,直到在 A.prototype 中找到 name 屬性,并返回其值。

再看這段代碼執行的時候,引擎做了什么事情:

  • 首先,嘗試遍歷對象 b 中的所有屬性,但沒有找到 name 這個屬性。
  • 查找 name 屬性的請求被委托給對象 b 的構造器的原型,它被 b.__proto__ 記錄著并且指向
    B.prototype,而 B.prototype 被設置為一個通過 new A()創建出來的對象。
  • 在該對象中依然沒有找到 name 屬性,于是請求被繼續委托給這個對象構造器的原型A.prototype。
  • 在 A.prototype 中找到了 name 屬性,并返回它的值。

????????和把 B.prototype 直接指向一個字面量對象相比,通過 B.prototype = new A()形成的原型鏈比之前多了一層。但二者之間沒有本質上的區別,都是將對象構造器的原型指向另外一個對象,繼承總是發生在對象和對象之間。
????????最后還要留意一點,原型鏈并不是無限長的。現在我們嘗試訪問對象 aaddress 屬性。而對象 b 和它構造器的原型上都沒有 address 屬性,那么這個請求會被最終傳遞到哪里呢?
實際上,當請求達到 A.prototype,并且在 A.prototype 中也沒有找到 address 屬性的時候,請求會被傳遞給 A.prototype 的構造器原型 Object.prototype,顯然 Object.prototype 中也沒有address 屬性,但 Object.prototype 的原型是 null,說明這時候原型鏈的后面已經沒有別的節點了。所以該次請求就到此打住,a.address 返回 undefined

a.address // 輸出:undefined

🧩 總結一下:原型繼承的核心思想

規則編號內容描述理解
Rule 1所有數據都是對象(或接近)老祖宗是 Object.prototype
Rule 2得到對象靠克隆原型,不是靠 new 類new 類 不寫構造函數,只管復制粘貼
Rule 3對象知道自己的原型是誰孩子知道自己老爸是誰
Rule 4請求失敗時,委托給原型處理自己不會?去找你爹

💬 最后一句靈魂總結:
在 JavaScript 的世界里,你不靠“類”吃飯,你靠“原型”混江湖。遇事不懂?先問問你爹再說!

結語:

本文的內容深受《JavaScript設計模式》一書的啟發,特別是關于原型模式的討論,該書深入淺出地介紹了這一重要的設計模式及其在JavaScript語言中的實現。原型模式不僅是眾多設計模式中的一員,它更是構建JavaScript這門語言基礎的核心之一。通過這本書,我們得以從更加簡單的Io語言入手,逐步理解原型模式的概念,并學習如何在JavaScript中應用這一模式來創建強大而靈活的對象系統。
在此,我對《JavaScript設計模式》的作者表示深深的感謝和敬意。是你細致入微的講解讓復雜的設計模式變得易于理解,也為像我這樣的開發者提供了寶貴的指導和靈感。如果你希望深入了解JavaScript中的設計模式及其背后的原理,《JavaScript設計模式》絕對是一本不容錯過的好書!

致敬—— 《JavaScript設計模式》· 曾探

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

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

相關文章

【數據庫】概述(純理論)

數據庫系統引論 數據管理系統的發展 數據管理:對數據分類、組織、編碼、存儲、檢索、維護 發展:人工管理、文件系統、數據庫系統 40-50年代 人工管理 數據不保存,沒有專門軟件管理數據,應用程序完全依賴于數據,數據…

語音合成之十七 語音合成(TTS)中文自然度:問題、成因、解決方案

語音合成(TTS)中文自然度:問題、成因、解決方案 中文TTS系統基本架構中文TTS常見問題深度剖析與解決方案音色跳變成因分析解決方案 聲調與重讀錯誤成因分析業界解決方案 漏讀與斷句錯誤成因分析業界解決方案 在跨語言TTS系統比較中&#xff0…

我在 Linux 進程管理中踩過的坑:僵尸、瞬時與不可中斷進程實戰實錄

作為運維老鳥,我曾在 Linux 進程管理上栽過不少跟頭。記得第一次遇到滿屏僵尸進程時,服務器直接卡到連 SSH 都登不上,看著ps命令里一排排刺眼的Z狀態進程,手心直冒冷汗。后來又碰到過瞬時進程搞崩日志系統,明明監控顯示…

【設計模式】簡單工廠模式,工廠模式,抽象工廠模式,單例,代理,go案例區分總結

工廠模式三種類型: 一、簡單工廠模式(Simple Factory) 定義: 用一個工廠類,根據傳入的參數決定創建哪一種具體產品類實例。 面試說法: 由一個統一的工廠創建所有對象,增加新產品時需要修改工…

某標桿房企BI平臺2.0升級實踐

當房地產行業從“規模競賽”轉向“精益運營”,數字化轉型成為破局關鍵。某千億房企攜手億信華辰,以“用數據重構業務價值鏈”為目標,歷經6個月完成BI平臺戰略性升級。在這場從“數據可視化”到“決策智能化”的躍遷中,億信華辰ABI…

Lua 腳本在 Redis 中的運用-24 (使用 Lua 腳本實現原子計數器)

實踐練習:使用 Lua 腳本實現原子計數器 實現原子計數器是許多應用程序中的常見需求,例如跟蹤網站訪問量、限制 API 請求或管理庫存。雖然 Redis 提供了 INCR 命令用于遞增整數,但在復雜場景或與其他操作結合時直接使用它可能并不足夠。本課程探討了如何在 Redis 中利用 Lua…

Rust 學習筆記:使用迭代器改進 minigrep

Rust 學習筆記:使用迭代器改進 minigrep Rust 學習筆記:使用迭代器改進 minigrep不使用 clone,而使用迭代器使用迭代器適配器使代碼更清晰在循環或迭代器之間進行選擇 Rust 學習筆記:使用迭代器改進 minigrep 前情提要&#xff1…

el-table配置表頭固定而且高度變化

根據官網提示只要在 el-table 元素中定義了 height 屬性,即可實現固定表頭的表格,而不需要額外的代碼。 如果你想既要固定表頭,又要下方表格高度自適應,可以設置為 height"100%" : 然后外層設置scroll:

弱光環境下如何手持相機拍攝靜物:攝影曝光之等效曝光認知

寫在前面 博文內容為一次博物館靜物拍攝筆記的簡單總結內容涉及:弱光環境拍攝靜物如何選擇,以及等效曝光的認知理解不足小伙伴幫忙指正 😃,生活加油 我看遠山,遠山悲憫 持續分享技術干貨,感興趣小伙伴可以關注下 _ 采…

ARM筆記-ARM偽指令及編程基礎

第四章 ARM偽指令及編程基礎 4.1 偽指令概述 4.1.1 偽指令定義 人們設計了一些專門用于指導匯編器進行匯編工作的指令,由于這些指令不形成機器碼指令,它們只是在匯編器進行匯編工作的過程中起作用,所以被叫做偽指令。 4.1.2 偽指令特征 …

智能手表怎么申請歐盟EN 18031認證

智能手表申請歐盟 EN 18031 認證(針對消費類物聯網設備的網絡安全標準)的流程與智能門鎖類似,但需結合手表的功能特性(如數據交互、定位、支付等)調整合規重點。以下是具體流程和關鍵要點: 一、標準適配與…

算法-全排列

1、全排列函數的使用 舉例&#xff1a;{1,2,3}的全排列 #include<iostream> #include<bits/stdc.h> using namespace std; typedef long long ll; int main(){ll a[3] {1, 2, 3};do{for (ll i 0; i < 3;i){cout << a[i] << " ";}cout…

面試加分秘籍:校招數據傾斜場景下的SQL優化方案

校招面試經常會問大家有沒有過調優的經驗&#xff0c;相信大家的回答基本都是往數據傾斜和小文件問題這兩方面回答&#xff0c;對于數據傾斜相信大部分同學對熱key打散或null值引發的傾斜已經非常熟悉&#xff0c;但這些內容面試官也是聽膩了&#xff0c;希望大家在面試時候講一…

Elasticsearch索引機制與Lucene段合并策略深度解析

引言 在現代分布式搜索引擎Elasticsearch中&#xff0c;文檔的索引、更新和刪除操作不僅是用戶交互的核心入口&#xff0c;更是底層存儲架構設計的關鍵挑戰。本文圍繞以下核心鏈路展開&#xff1a; 文檔生命周期管理&#xff1a;從客戶端請求路由到分片定位&#xff0c;從內存…

git提交更改

第一步&#xff1a;添加改動 git add . 第二步&#xff1a;提交改動 git commit -m “替換了 SerialPort 庫文件” 第三步&#xff1a;推送到遠程 git push 為什么git 的UI界面做的遠不如SVN

WPF的基礎控件:布局控件(StackPanel DockPanel)

布局控件&#xff08;StackPanel & DockPanel&#xff09; 1 StackPanel的Orientation屬性2 DockPanel的LastChildFill3 嵌套布局示例4 性能優化建議5 常見問題排查 在WPF開發中&#xff0c;布局控件是構建用戶界面的基石。StackPanel和DockPanel作為兩種最基礎的布局容器&…

互聯網大廠Java求職面試:AI大模型推理服務性能優化與向量數據庫分布式檢索

互聯網大廠Java求職面試&#xff1a;AI大模型推理服務性能優化與向量數據庫分布式檢索 面試現場&#xff1a;技術總監的連環追問 技術總監&#xff1a;&#xff08;翻看著簡歷&#xff09;鄭薪苦&#xff0c;你在上一家公司參與過LLM推理服務的性能優化項目&#xff1f;說說你…

如何解決網站服務器的異常問題?

當網站服務器出現異常情況&#xff0c;導致用戶無法正常訪問網頁信息的時候&#xff0c;該如何解決這一問題呢&#xff1f;小編下面就帶領大家共同探討一下這一問題。 企業在面對網站服務器異常時&#xff0c;首先要對服務器硬件設備進行詳細的檢查&#xff0c;可以使用硬盤檢測…

Day 35

模型可視化與推理 知識點回顧&#xff1a; 三種不同的模型可視化方法&#xff1a;推薦torchinfo打印summary權重分布可視化 進度條功能&#xff1a;手動和自動寫法&#xff0c;讓打印結果更加美觀 推理的寫法&#xff1a;評估模式 模型結構可視化 理解一個深度學習網絡最重要的…

[yolov11改進系列]基于yolov11引入自注意力與卷積混合模塊ACmix提高FPS+檢測效率python源碼+訓練源碼

[ACmix的框架原理] 1.1 ACMix的基本原理 ACmix是一種混合模型&#xff0c;結合了自注意力機制和卷積運算的優勢。它的核心思想是&#xff0c;傳統卷積操作和自注意力模塊的大部分計算都可以通過1x1的卷積來實現。ACmix首先使用1x1卷積對輸入特征圖進行投影&#xff0c;生成一組…