概念与特点
概念:
享元模式是一种性能优化方案,其核心是利用共享技术有效支持大量类似的颗粒度对象,从而尽可能减少对象的创建,节省内存空间。
特点:
- 相同对象只需要保存一份,减少对象的数量。
- 为了使对象能够共享,需要将一些不能共享的状态外部化,从而增加系统复杂度。
结构与实现
享元模式包含抽象享元类,具体享元类,非享元类,享元工厂类。
抽象享元类:定义抽象方法,外部状态通过参数传入。
具体享元类:实现抽象享元中的方法。
非享元类:不可以共享的外部状态,以参数的形式传入到具体享元的方法中。
享元工厂类:复杂创建和管理享元角色。
小剧场:
比如工厂有 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>
应用场景
- 系统中存在相同或相似的对象,并且耗费大量的内存资源。
- 大部分的对象可以按照内部状态进行分组。
- 有足够多的享元实例才值得使用享元模式。
应用实例
暂无。
总结
享元模式就是将相同的对象进行储存(储存之前先创建,然后下次直接获取),将相似的对象进行封装。然后通过参数传入外部状态,完成一系列的功能。