单例模式

# 单例模式

# 介绍

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

  • 单例类只能有一个实例。
  • 单例类必须自己创建自己的唯一实例。
  • 单例类必须给所有其他对象提供这一实例。
class Singleton{
  constructor(){
    if(!Singleton.instance){
      this.list = []
      Singleton.instance = this
    }
    return Singleton.instance
  }
  add(a){
    this.list.push(a)
  }
}
const sing = new Singleton()
sing.add('1')
const sing2 = new Singleton()
sing2.add('2')
console.log(sing.list);
var Singleton = (function () {
  var goodsList = [];
  var instance;
  return function () { // 调用了才会创建实例
    // 保证只有一个实例
    if (!instance) {
      // 实例
      instance = {
        addGood (good) {
          goodsList.push(good);
        },
        showGoodsList () {
          console.log(goodsList);
        }
      };
    }
    return instance;
  };
})();

var a = Singleton()

单例模式分为两种:懒汉式和饿汉式。

# 懒汉式

懒汉式:使用即创建,即加载时不会创建实例,只有使用时才会创建实例

上述代码就是一个懒汉式的单例模式,具体细节不再讲解。 Singleton是一个高级函数,其返回值是一个函数。 var singleton = (function () {....})只是加载了一个singleton而已,并没有调用,var a = singleton()才是正式调用,此时才会进行if判断并创建实例。

# 饿汉式

饿汉式:加载即创建,即加载时就创建了实例,不用是否调用,都已经存在 将上述代码稍微改写一下

// ES5中的单例模式
var Singleton = (function () {
  var goodsList = [];
  var instance = { // 加载即创建实例
    addGood (good) {
      goodsList.push(good);
    },
    showGoodsList () {
      console.log(goodsList);
    }
  };
  // 调用的时候直接返回实例,保证只有一个实例
  return function () {
    return instance;
  };
})();

var a = Singleton()
// 在分类页添加了一个商品
a.addGood({id: 1, name: '橘子'})
a.showGoodsList() // 输出:[{id: 1, name: '橘子'}]

var b = Singleton()
// 在商品详情页添加了一个商品
b.addGood({id: 2, name: '苹果'})
b.showGoodsList() // 输出:[{id: 1, name: '橘子'}, {id: 2, name: '苹果'}]

# 优点

  • 确保了只有一个实例
  • 因为只有唯一实例,所以节省了系统资源,记住创建和销毁也需要浪费内存资源
  • 避免了对资源的多重占用,比如数据库的连接
  • 资源共享
上次更新: 2 分钟前