服務(wù)器維護(hù)網(wǎng)站建設(shè)教程網(wǎng)絡(luò)營銷策略分析
Flyweight pattern
享元模式是一種結(jié)構(gòu)化的設(shè)計模式,主要用于產(chǎn)生大量類似對象而內(nèi)存又有限的場景。享元模式能節(jié)省內(nèi)存。
假設(shè)一個國際化特大城市SZ;它有5個區(qū),分別為nanshan、futian、luohu、baoan、longgang;每個區(qū)都有多個圖書館,每個圖書館都有大量的圖書,每種書都會有多本,那么該城市要建一個圖書管理系統(tǒng)顯然需要非常大的內(nèi)存資源。通常同一本書會有多本,本文中叫做多個副本,以便表述;例如,《遙遠(yuǎn)的救世主》這本書總共有100本,我們就說有100個副本。
一本書通常有多個屬性,例如,書名、作者、ISBN、圖例、所屬圖書館、總數(shù)量、在館數(shù)量等等。如果每一本書的每一個副本,我們都創(chuàng)建一個對象來進(jìn)行管理,有些共有的屬性所占用的內(nèi)存是一種顯而易見的浪費(fèi)。那么,在這種場景下,使用享元模式就能極大的優(yōu)化圖書管理系統(tǒng)的內(nèi)存。所有類似場景使用享元模式都能奏效,如、游戲等。
通過通俗的場景描述了享元模式的作用,接下來,在技術(shù)層面來看看要怎樣實(shí)現(xiàn)。需要說明的是,該模式也可以用于其他設(shè)計語言,不限于JS。
首先,創(chuàng)建一個圖書類Book
。
class Book {constructor(title, author, isbn) {this.title = title;this.author = author;this.isbn = isbn;}
}
如果不用享元模式,我們創(chuàng)建多個副本,簡單粗暴可能會這么實(shí)現(xiàn):
const book1 = new Book("遙遠(yuǎn)的救世主", "豆豆", "abc123");
const book2 = new Book("遙遠(yuǎn)的救世主", "豆豆", "abc123");
const book3 = new Book("遙遠(yuǎn)的救世主", "豆豆", "abc123");
const book4 = new Book("遙遠(yuǎn)的救世主", "豆豆", "abc123");
如果使用享元模式,一種實(shí)現(xiàn)方式如下:
const books = new Map();
const createBook = (title, author, isbn) => {const existingBook = books.has(isbn);if (existingBook) {return books.get(isbn);}const book = new Book(title, author, isbn);books.set(isbn, book);return book;
};
可以通過ISBN來判斷某種圖書的唯一性,通過createBook
來創(chuàng)建某一種圖書。其他的副本我們可以通過addBook
來實(shí)現(xiàn):
const bookList = [];const addBook = (title, author, isbn, region) => {const book = {...createBook(title, author, isbn),region};bookList.push(book);return book;
};addBook("遙遠(yuǎn)的救世主", "豆豆", "AB123", "nanshan");
addBook("遙遠(yuǎn)的救世主", "豆豆", "AB123", "longgang");
addBook("埃隆·馬斯克傳", "沃爾特·艾薩克森", "CD123", "nanshan");
addBook("埃隆·馬斯克傳", "沃爾特·艾薩克森", "CD123", "futian");
addBook("長安的荔枝", "馬伯庸", "EF123", "bao'an");console.log("圖書總數(shù):", bookList.length);
console.log("圖書種類數(shù):", books.size);
運(yùn)行結(jié)果:
本文通過通俗的自然語言和實(shí)際的代碼示例,描述了flyweight pattern的原理和使用場景??稍谑纠幕A(chǔ)上結(jié)合實(shí)際場景進(jìn)行擴(kuò)展,來完成更復(fù)雜的程序設(shè)計。