一、单例模式
1.保证一个类仅有一个实例,并提供一个访问它的全局访问点
2.设计思路:如果存在,不创建,直接返回,不存在才创建。
在类的constructor方法里添加一个判断条件属性,并且让创建的实例赋给这个属性。判断该属性,没有则创建,有则返回该属性。
实际开发中,单例模式下最有用的是惰性单例。
const oBtn = document.querySelector(‘button‘); let box = (function () { let cDiv = document.createElement(‘div‘); cDiv.innerHTML = ‘我是登录浮窗‘; cDiv.style.display = ‘none‘; document.body.appendChild(cDiv); return cDiv;
})();
oBtn.onclick = function () { box.style.display = ‘block‘; }
不过这种方式有个问题:一开始就会有个display为none的div,这样浪费一些DOM节点。
解决:
这里box函数里通过return一个函数(这个函数里放如何实现创建这个浮窗),这样在点击事件触发前,不会执行return里的函数,也就不会创建浮窗。
const oBtn = document.querySelector(‘button‘); let box = (function () { let cDiv = null;//需要创建的对象 return function () { if (!cDiv) {//不存在,创建 cDiv = document.createElement(‘div‘); cDiv.innerHTML = ‘我是登录浮窗‘; cDiv.style.display = ‘none‘; document.body.appendChild(cDiv); } return cDiv;//存在直接返回 } })(); oBtn.onclick = function () { let cdiv = box(); cdiv.style.display = ‘block‘; }
二、组合模式
//组合模式解决。 class Compose { constructor() { this.objarr = [];//存储对象的数组 } add(obj) {//将实例化的对象添加到数组里面。 this.objarr.push(obj); } execute() {//遍历执行数组里面对象,对象调用入口方法。 for (let i = 0; i < this.objarr.length; i++) { this.objarr[i].init(); } } } let p1 = new Compose(); p1.add(new A());//添加实例化方法。 p1.add(new B()); p1.add(new C()); p1.execute();//执行
原文:https://www.cnblogs.com/QQ1210611769/p/12513898.html