----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
单例设计模式
一:简介:
单例模式是一种最简单的软件设计模式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
二:目的:
希望对象只创建一个实例,并且提供一个全局的访问点。
一般对于对于系统中的某些类来说,只有一个实例很重要,例如,如在Windows中就只能打开一个任务管理器。如果不使用机制对窗口对象进行唯一化,将弹出多个窗口,如果这些窗口显示的内容完全一致,则是重复对象,浪费内存资源;如果这些窗口显示的内容不一致,则意味着在某一瞬间系统有多个状态,与实际不符,也会给用户带来误解,不知道哪一个才是真实的状态。因此有时确保系统中某个对象的唯一性即一个类只能有一个实例非常重要。又例如:每台计算机可以由若干个打印机,但只能有一个Printer Spooler,避免有两个作业同时输出到打印机。
三:分析
单例模式的特征有三点:
1)一是某个类只能有一个实例;
所以不能让外界随意的new对象,自然设计单例类的时候。要将其构造函数私有化(加上private修饰符)。这是很直白的想法
2)二是它必须自行创建这个实例;
既然外界不能创建对象,那么自然要在类内部定义唯一一个该类的静态私有对象。
3)三是它必须自行向整个系统提供这个实例。
必须用类名来调用,所以该类要提供一个静态的共有的函数用于获取它本身的静态私有对象.返回在2)中定义的静态私有对象
四:实例:单例的java代码分析
单例模式实例化对象有两种方式
(1)饿汉式:
// 线程安全 但效率比较低 一开始加载类就要new一个 对象
public class Single {
private Single(){
}
private static final Single instance=new Single();
public static Single getInstance(){
return instance;
}
}
(2)饱汉式:
// 因为操作instance的语句有两句,所以有多个线程访问时就可能是不安全的 public class Single{
private Single(){
}
private static Single instance;
public static Single getInstance() {
if (instance == null)
instance = new Single ();
return instance;
}
}
3)在实际开发中:为了兼并安全性与效率:一般采用如下方式:
/* 线程安全 并且效率高 能有多个线程访问*/
public class Single{
private static Single instance;
private Single() {
}
public static Single getIstance() {
if (instance == null) {
synchronized ( Single.class) {
if (instance == null) {
instance = new Single();
}
}
}
return instance;
}
}
· 由于单例模式在内存中只有一个实例,减少了内存开支,特别是一个对象需要频繁的被创建、销毁,而且创建或销毁时性能又无法优化,单例模式的优势就非常明显;
· 由于单例模式只生成一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决(在Java EE中采用单例模式时需要注意JVM垃圾回收机制);
· 单例模式可以在系统设置全局的访问点,优化环共享资源访问,例如可以设计一个单例类,负责所有数据表的映射处理。
2) 缺点
· 单例模式没有接口,扩展很困难,若要扩展,除了修改代码没有第二种途径可以实现。
· 单例模式单例模式与单一职责原则有冲突。一个类应该只实现一个的逻辑,而不关心它是否是单例的,决定它是不是要单例是环境决定的,单例模式把“要单例”和业务逻辑融合也在一个类中。
---- ASP.Net+Android+IOS开发、.Net培训、期待与您交流!--------详细请查看:http://edu.csdn.net------