ใน JavaScript เบราว์เซอร์โดยเฉพาะเบราว์เซอร์บนอุปกรณ์มือถือจัดสรรหน่วยความจำที่ จำกัด มากและวิธีการบันทึกหน่วยความจำได้กลายเป็นสิ่งที่มีความหมายมาก วิธีที่มีประสิทธิภาพในการบันทึกหน่วยความจำคือการลดจำนวนวัตถุ
โหมด Flyweight (Flyweight) ใช้เทคโนโลยีการแชร์เพื่อรองรับวัตถุที่มีความละเอียดจำนวนมากอย่างมีประสิทธิภาพหลีกเลี่ยงค่าใช้จ่ายของชั้นเรียนขนาดเล็กจำนวนมากที่มีเนื้อหาเดียวกัน (เช่นการใช้หน่วยความจำ) และอนุญาตให้ทุกคนแบ่งปันคลาส (metaclass)
รูปแบบสารานุกรมสามารถหลีกเลี่ยงค่าใช้จ่ายที่คล้ายกันจำนวนมาก ในการเขียนโปรแกรมบางครั้งจำเป็นต้องสร้างอินสแตนซ์คลาสที่ละเอียดจำนวนมากเพื่อแสดงข้อมูล หากคุณพบว่าอินสแตนซ์เหล่านี้มีค่าใช้จ่ายเท่ากันยกเว้นพารามิเตอร์สองสามตัวคุณสามารถลดจำนวนคลาสที่ต้องมีการสร้างอินสแตนซ์ได้อย่างมีนัยสำคัญ หากพารามิเตอร์เหล่านั้นสามารถเคลื่อนย้ายออกไปนอกอินสแตนซ์ของชั้นเรียนและส่งผ่านเมื่อวิธีการที่เรียกว่าจำนวนของแต่ละอินสแตนซ์สามารถลดลงได้อย่างมากโดยการแบ่งปัน
มีสองวิธีในการใช้โหมดสารานุกรมใน JavaScript สิ่งแรกคือการใช้มันกับเลเยอร์ข้อมูลส่วนใหญ่กับวัตถุที่คล้ายกันจำนวนมากในหน่วยความจำ ประการที่สองคือการใช้มันกับเลเยอร์ DOM สารานุกรมสามารถใช้กับตัวจัดการเหตุการณ์กลางเพื่อหลีกเลี่ยงการเพิ่มที่จับเหตุการณ์ในแต่ละองค์ประกอบเด็กในคอนเทนเนอร์พาเรนต์
มีแนวคิดที่สำคัญสองประการในฟลายเวท - สถานะภายในและภายนอกสถานะภายนอก สถานะภายในได้รับการจัดการด้วยวิธีการภายในในวัตถุและข้อมูลภายนอกสามารถลบหรือบันทึกภายนอกได้
ในการกล่าวอย่างตรงไปตรงมามันเป็นครั้งแรกที่จะหยิกโมเดลดั้งเดิมจากนั้นสร้างโมเดลเฉพาะที่มีลักษณะที่แตกต่างกันตามโอกาสและสภาพแวดล้อมที่แตกต่างกัน เห็นได้ชัดว่าต้องมีการสร้างวัตถุใหม่ที่แตกต่างกันที่นี่ดังนั้นโหมดโรงงานมักจะปรากฏในโหมดฟลายเวท สถานะภายในของฟลายเวทใช้เพื่อแบ่งปัน Flyweight Factory รับผิดชอบในการรักษาสระว่ายน้ำฟลายเวท (พูลโหมด) เพื่อจัดเก็บวัตถุที่มีสถานะภายใน
เราสามารถแทนที่วัตถุทั้งหมดด้วยสถานะภายในเดียวกันด้วยวัตถุที่ใช้ร่วมกันเดียวกันและเพื่อสร้างวัตถุที่ใช้ร่วมกันนั้นจำเป็นต้องใช้วิธีการจากโรงงานซิงเกิลแทนตัวสร้างปกติ สิ่งนี้สามารถติดตามวัตถุแต่ละรายการที่ได้รับการสร้างอินสแตนซ์เพื่อให้วัตถุใหม่ถูกสร้างขึ้นเฉพาะในกรณีที่สถานะภายในของวัตถุที่ต้องการนั้นแตกต่างจากวัตถุที่มีอยู่ สถานะภายนอกของวัตถุจะถูกบันทึกไว้ในวัตถุผู้จัดการ เมื่อเรียกใช้วิธีการของวัตถุผู้จัดการจะผ่านสถานะภายนอกเหล่านี้เป็นพารามิเตอร์
บันทึกข้อมูลของวัตถุในสองวัตถุที่แตกต่างกัน (วัตถุที่แชร์, วัตถุจัดการ)
1. วัตถุที่ใช้ร่วมกัน (เพลิดเพลินกับวัตถุดั้งเดิม)
2. วิธีการโรงงาน Singleton (สร้างวัตถุที่ใช้ร่วมกัน)
3. วัตถุผู้จัดการ (จัดการสถานะภายนอก)
ตัวอย่างเช่นหนังสือในห้องสมุดสามารถแสดงโดยวัตถุซึ่งมีคุณลักษณะมากมาย
var book = function (id, ชื่อ, ผู้แต่ง, ประเภท, pagecount, publisherid, isbn, checkoutdate, checkoutmember, duereturndate, ความพร้อมใช้งาน) {... // รหัสเริ่มต้น} book.prototype = {getTitle: function () {return.title; }, ... // อัปเดตวิธีการสถานะการให้ยืม updateCheckOutStatus: function (bookid, newstatus, checkoutdate, checkoutmember, newreturndate) {... }, // ต่ออายุ ExtionCheckOutiod: ฟังก์ชั่น (bookid, newreturndate) {... }, //โปรแกรมอาจจะดีในตอนแรก แต่เมื่อเวลาผ่านไปหนังสืออาจเพิ่มขึ้นในปริมาณมากและหนังสือแต่ละประเภทมีรุ่นและตัวเลขที่แตกต่างกันคุณจะพบว่าระบบเริ่มช้าลงและช้าลง วัตถุหนังสือหลายพันรายการสามารถจินตนาการได้ในหน่วยความจำและเราจำเป็นต้องใช้โหมดสารานุกรมเพื่อปรับให้เหมาะสม
เราสามารถแบ่งข้อมูลออกเป็นข้อมูลสองประเภท ในหนังสือเล่มเดียวกันข้อมูลที่เกี่ยวข้องกับวัตถุหนังสือ (ชื่อเรื่องผู้แต่ง ฯลฯ ) สามารถนำมาประกอบกับคุณสมบัติภายในในขณะที่ (checkoutmember, duereturndate ฯลฯ ) สามารถนำมาประกอบกับคุณสมบัติภายนอก ด้วยวิธีนี้รหัสต่อไปนี้สามารถแบ่งปันวัตถุเดียวกันในหนังสือเล่มเดียวกันได้เพราะไม่ว่าใครจะยืมหนังสือตราบใดที่หนังสือเล่มนี้เป็นหนังสือเล่มเดียวกันข้อมูลพื้นฐานก็เหมือนกัน:
// ที่ใช้ร่วมกันวัตถุ var book = function (ชื่อ, ผู้แต่ง, ประเภท, pagecount, publisherId, isbn) {this.title = title; this.author = ผู้แต่ง; this.genre = ประเภท; this.pagecount = pagecount; this.publisherId = PublisherId; this.isbn = isbn;};มากำหนดโรงงานพื้นฐานเพื่อตรวจสอบว่าวัตถุของหนังสือถูกสร้างขึ้นมาก่อนกลับมาหรือไม่หากมีและสร้างใหม่และจัดเก็บมันเพื่อให้สามารถเข้าถึงได้ในภายหลัง
/* Book Factory Singleton*/var bookFactory = (function () {var repiverbooks = {}; return {createbook: ฟังก์ชั่น (ชื่อ, ผู้แต่ง, ประเภท, pagecount, publisherid, isbn) {/* ค้นหาว่าจะสร้างก่อนหน้า* = หนังสือเล่มใหม่ (ชื่อผู้แต่ง, ประเภท, pagecount, publisherid, isbn);สถานะภายนอกค่อนข้างง่าย ยกเว้นหนังสือที่เราห่อหุ้มทุกอย่างอื่น ๆ จะต้องมีการจัดการที่นี่:
/*BookRecordManager Singleton สำหรับการจัดการยืม*/var bookRecordManager = (ฟังก์ชั่น () {var bookRecordDatabase = {}; return {/*เพิ่มบันทึกการยืม*/addBookRecord: id, {id, ชื่อ, ผู้แต่ง, ประเภท BookFactory.CreateBook (ชื่อผู้แต่ง, ประเภท, pagecount, publisherid, isbn); Checkoutdate, Checkoutmember, Newreturndate) {var record = bookrecorddatabase [bookid]; BookRecordDatabase [bookid] .duereturndate = newreturndate;ด้วยวิธีนี้เราได้บันทึกข้อมูลเดียวกันของหนังสือเล่มเดียวกันในวัตถุ BookManager และบันทึกเพียงหนึ่งสำเนา; เมื่อเทียบกับรหัสก่อนหน้านี้เราสามารถพบว่ามันบันทึกหน่วยความจำจำนวนมาก
พูลวัตถุ
Object Pool เป็นโซลูชันการเพิ่มประสิทธิภาพประสิทธิภาพอื่นซึ่งมีความคล้ายคลึงกันกับโหมด Xiangyuan แต่ไม่ได้แยกสถานะภายในและสถานะภายนอก
การใช้งานพูลวัตถุทั่วไป:
var ObjectPoolFactory = ฟังก์ชั่น (createObjfn) {var objectPool = []; // Object Pool return {create: function () {// ดึง var obj = objectpool.length === 0? createObjfn.apply (สิ่งนี้, อาร์กิวเมนต์): objectpool.shift (); คืน OBJ; }, กู้คืน: ฟังก์ชั่น (obj) {// ดึง ObjectPool.push (OBJ); -ตอนนี้ใช้ ObjectPoolFactory เพื่อสร้างพูลวัตถุที่โหลด iframes บางส่วน:
var iframefactory = ObjectPoolFactory (function () {var iframe = document.createElement ('iframe'); document.body.appendchild (iframe); iframe.onload = function () {iframe.onload = null; ส่งคืน iframe;}); // โทร var iframe1 = iframefactory.create (); iframe1.src = 'http://www.qq.com';ข้อมูลอ้างอิง: "JavaScript Pattern" "JavaScript Design Pattern and Development Practice"
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น