概念與特點
概念:
享元模式是一種性能優化方案,其核心是利用共享技術有效支持大量類似的顆粒度對象,從而儘可能減少對象的創建,節省內存空間。
特點:
- 相同對象只需要保存一份,減少對象的數量。
- 爲了使對象能夠共享,需要將一些不能共享的狀態外部化,從而增加系統複雜度。
結構與實現
享元模式包含抽象享元類,具體享元類,非享元類,享元工廠類。
抽象享元類:定義抽象方法,外部狀態通過參數傳入。
具體享元類:實現抽象享元中的方法。
非享元類:不可以共享的外部狀態,以參數的形式傳入到具體享元的方法中。
享元工廠類:複雜創建和管理享元角色。
小劇場:
比如工廠有 50 種男內衣和 50 種女內衣,如果不用享元模式,可能分別需要 50 個男模特和 50 個女模特。即需要創建 100 個對象。
var Model = function( sex, underwear){
this.sex = sex;
this.underwear= underwear;
};
Model.prototype.takePhoto = function(){
console.log( 'sex= ' + this.sex + ' underwear=' + this.underwear);
};
for ( var i = 1; i <= 50; i++ ){
var maleModel = new Model( 'male', 'underwear' + i );
maleModel.takePhoto();
};
for ( var j = 1; j <= 50; j++ ){
var femaleModel= new Model( 'female', 'underwear' + j );
femaleModel.takePhoto();
};
如果使用享元模式則只需要創建兩個對象即可。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>React App</title>
</head>
<body>
<script>
//抽象享元角色-模特
class Modal{
//傳入外部狀態-拍照
takePhoto(underwear){
}
}
//具體享元角色
class GenderModal extends Modal{
constructor(gender){
super();
this.gender = gender;
console.log("具體享元"+gender+"被創建")
}
takePhoto(underwear){
console.log( 'gender= ' + this.gender + ' underwear=' + underwear.getState());
}
}
//非享元角色-不能共享的外部狀態
class OutState{
constructor(state){
this.state = state;
}
getState(){
return this.state;
}
}
//享元工廠角色-創建和管理享元角色
class Factory{
constructor(){
this.resource = new Map();
}
getModal(key) {
var fly = this.resource.get(key);
if(fly!=null){
console.log("具體享元"+key+"已經存在")
}else {
fly = new GenderModal(key);
this.resource.set(key,fly);
}
return fly;
}
}
class Customer{
static main(){
let factory = new Factory();
let maleModal = factory.getModal("male");
let femaleModal = factory.getModal("female");
for(let i = 0;i<50;i++){
maleModal.takePhoto(new OutState(i));
femaleModal.takePhoto(new OutState(i));
}
}
}
Customer.main();
</script>
</body>
</html>
應用場景
- 系統中存在相同或相似的對象,並且耗費大量的內存資源。
- 大部分的對象可以按照內部狀態進行分組。
- 有足夠多的享元實例才值得使用享元模式。
應用實例
暫無。
總結
享元模式就是將相同的對象進行儲存(儲存之前先創建,然後下次直接獲取),將相似的對象進行封裝。然後通過參數傳入外部狀態,完成一系列的功能。