Skip to content

单例模式 #16

Description

@isNeilLin

单例模式

定义: 一个类只有一个实例,并提供访问它的全局访问点。

用一个变量来标记当前是否已经为某个类创建了对象。

透明单例模式

varcreateDiv=(function(){varinstance;varcreateDiv=function(html){if(instance){returninstance;}this.html=html;this.init();returninstance=this;}createDiv.prototype.init=function(){vardiv=document.createElement('div');div.innerHTML=this.html;document.body.appendChild(div);}returncreateDiv;})()

代理实现单例模式

varcreateDiv=function(html){this.html=html;this.init()}createDiv.prototype.init=function(){vardiv=document.createElement('div');div.innerHTML=this.html;document.body.appendChild(div);}varProxySingletonCreateDiv=(function(){varinstance;returnfunction(html){if(!instance){instance=newcreateDiv(html);}returninstance;}})()

惰性单例模式

vargetSingleton=function(fn){varresult;returnfunction(){returnresult||(result=fn.apply(this,arguments))}}varcreateLoginLayer=function(){vardiv=document.createElement('div');div.innerHTML='我是登录浮窗';div.style.display='none';document.body.appendChild(div);returndiv;};varcreateSingleLoginLayer=getSingle(createLoginLayer);document.getElementById('loginBtn').onclick=function(){varloginLayer=createSingleLoginLayer();loginLayer.style.display='block';};

创建对象和管理单例的职责被分布在两个不同的方法中,这两个方法组合起来才具有单例模式的威力。

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions