首页 / 设计模式 / 设计模式——单例模式
设计模式——单例模式
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了设计模式——单例模式,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1683字,纯文字阅读大概需要3分钟。
内容图文
最近系统的看了下设计模式,对于单例又有一些新的理解:
1.单例和静态变量有什么优缺点:
- 静态变量一般在定义的时候就初始化了(有些语言要求这样),如果不用是一种浪费,而单例一般是延迟实例化(第一次用的时候才实例化),如果要实例化的对象十分消耗内存,那么就要关心这点。
- 静态变量还是可以被更改的,有时候要靠程序员之间的约定,才能做到唯一(大家都不要动它)。单例天然可以做到这点。
2.单例的各种方式:
(1).最简单的模式(不考虑多线程)
public class Singleton { private static Singleton uniqueInstance; private Singleton () {} // 不允许外界调用构造函数 public static Singleton getInstance () { if ( uniqueInstance == null ) { uniqueInstance = new Singleton () ; } return uniqueInstance; } // 其他方法 }
(2).考虑多线程,避免创造出两个对象,把getInstance方法设置成同步方法
public class Singleton { private static Singleton uniqueInstance; private Singleton () {} // 不允许外界调用构造函数 public static synchronized Singleton getInstance () { if ( uniqueInstance == null ) { uniqueInstance = new Singleton () ; } return uniqueInstance; } // 其他方法 }
这种方法有个问题:就是同步会降低性能,如果项目会频繁的调用getInstance方法,而又十分的在意性能,那么这样不是一个好方法,如果不是这样,那么这样就可以满足要求。
(3).对于多线程的改善:
A:使用“急切”创建实例,而不用延迟实例化的做法,适用于创建的对象并不是十分耗内存,即时很晚才用到或者压根不用,完全不care。
public class Singleton { private static Singleton uniqueInstance = new Singleton () ; private Singleton () {} public static Singleton getInstance () { return uniqueInstance; } }
B:利用“双重检查加锁”,在getInstance()中减少使用同步
public class Singleton { private volatile static Singleton uniqueInstance; private Singleton () {} public static Singleton getInstance () { if (uniqueInstance == null) { synchronized (Singleton.class) { // 只有第一次才会走到这里 if (uniqueInstance == null) { uniqueInstance = new Singleton (); } } } return uniqueInstance; } }
*考虑如果实现ios的“双重检查加锁”。
3.其实可以说单例模式违反了“单一职责”的设计原则,因为不只要维护自己先关的功能,还要管理自己的实例化,但是这样可以让整体设计更简单,所以还是那句话,设计原则只不过是要尽量的遵守,不是一定要百分之百不能违背。各种设计模式,都可以思考下,遵守了哪些设计原则,违反了哪些设计原则。
原文:http://www.cnblogs.com/zhang-chi/p/6040798.html
内容总结
以上是互联网集市为您收集整理的设计模式——单例模式全部内容,希望文章能够帮你解决设计模式——单例模式所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。