单例模式
饿汉式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| var Singleton = (function() { var instance;
function createInstance() { return { name: 'Singleton', getName: function() { console.log(this.name); } }; }
return { getInstance: function() { if (!instance) { instance = createInstance(); } return instance; } }; })();
var singleton1 = Singleton.getInstance(); singleton1.getName();
var singleton2 = Singleton.getInstance(); singleton2.getName();
console.log(singleton1 === singleton2);
|
懒汉式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| var LazySingleton = (function() { var instance;
function createInstance() { var object = new Object("I am the instance"); return object; }
return { getInstance: function() { if (!instance) { instance = createInstance(); } return instance; } }; })();
var singleton1 = LazySingleton.getInstance(); console.log(singleton1);
var singleton2 = LazySingleton.getInstance(); console.log(singleton2);
console.log(singleton1 === singleton2);
|
单例模式是一种在软件工程中常用的设计模式,它确保一个类仅有一个实例,并提供一个全局访问点来访问这个实例。以下是单例模式的一些优缺点:
优点:
- 控制了实例的数量:单例模式确保系统中一个类只有一个实例,这有助于节约系统资源,特别是当对象的创建开销较大时。
- 全局访问点:单例模式提供了一个全局访问点,这使得它可以方便地被其他对象访问。
- 避免共享资源的多重占用:在系统中,某些类对于实例化多个对象可能没有意义,或者可能会导致错误,单例模式可以防止这种情况的发生。
- 允许对实例进行优化:由于单例模式限制了实例的个数,因此可以在不影响系统其他部分的情况下对实例进行优化。
缺点:
- 违反单一职责原则:单例类除了自身的业务逻辑外,还负责控制实例的创建,这可能会使得类承担过多的职责。
- 不利于测试:单例模式使得单例类很难进行单元测试,因为它通常涉及到静态方法和全局状态。
- 可能导致代码的不透明性:客户端代码可能不知道它们正在使用单例,因为它们是通过全局访问点来获取实例的,这可能会使得代码更难以理解和维护。
- 并发问题:在多线程环境下,单例模式可能会导致并发问题,因为多个线程可能会同时尝试创建单例类的实例。
- 难以扩展:由于单例模式限制了实例的数量,因此在某些情况下可能难以扩展,尤其是在需要多个实例的情况下。
- 可能导致资源闲置:如果单例持有资源(如数据库连接),而该资源在长时间内未被使用,则可能导致资源浪费。
总的来说,单例模式在特定场景下非常有用,例如管理数据库连接或配置文件,但是它也可能导致一些设计上的问题,因此在选择使用单例模式时需要权衡其优缺点。