设计模式-------单例模式

转载 2018年04月16日 10:29:13

1.设计思路:

    单例模式要求能返回一个对象的引用,和一个获得该实例的方法(静态方法)

    (1).将该类的构造方法定义为私有的方法,其他处的代码无法通过调用该类的构造方法来实例化该类的对象,只能通过提供的静态方法来得到该类的唯一实例

    (2).该类内部提供一个静态方法,当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果该类保持的引用为空就创建实例,并将实例的应用赋予该类的引用。

2.注意事项:

    多线程场景下必须小心使用,当类的唯一实例没有创建时,两个线程同时创建实例,两个线程没有同时检测到唯一的实例存在,从而同时创建两个实例,违反了单例模式唯一实例的原则。

3.代码实例

   1.饿汉式

        优点:类加载就完成了实例化,避免了 线程同步问题

        缺点:如果至始至终都没用过这个实例,就会造成内存浪费

    (1)静态常量

public class Singleton {
	private static final Singleton INSTANCE = new Singleton();
	
	private Singleton(){
		System.out.println("-->饿汉式单例模式开始调用构造函数");
	}
	
	public static Singleton getInstance(){
		System.out.println("-->饿汉式单例模式开始调用公有方法返回实例");
		return INSTANCE;
	}
	
	public void showMessage(){
		System.out.println("Hello world");
	}
}
 (2).(静态代码块)
public class Singleton {
	
	private static Singleton instance;
	
	static{
		instance = new Singleton();
	}
	
	private Singleton(){
		System.out.println("-->饿汉式单例模式开始调用构造函数");
	}
	
	public static Singleton getInstance(){
		System.out.println("-->饿汉式单例模式开始调用公有方法返回实例");
		return instance;
	} 
	
	public void showMessage(){
		System.out.println("Hello world");
	}
}

2.懒汉式

    线程不安全,只能在单线程下使用。

public class Singleton {
	private static Singleton singleton;
	
	private Singleton(){
		System.out.println("-->懒汉式单例模式开始调用构造函数");
	}
	
	public static Singleton getInstance(){
		System.out.println("懒汉式单例模式开始调用公有方法返回实例");
		if(singleton == null){
			System.out.println("-->懒汉式构造函数的实例当前并没有被创建");
			singleton = new Singleton();
		}else{
			System.out.println("-->懒汉式构造函数的实例已经被创建");
		}
		System.out.println("-->方法调用结束,返回单例"); 
		return singleton;
	}
	
	public static void showMessage(){
		System.out.println("hello word");
	}
}

3.懒汉式双重检

package danlimoshi;

public class Singleton {
	
	private static Singleton instance;
	
	private Singleton() {
		System.out.println("-->懒汉式单例模式开始调用构造函数");
	}
	
	public static Singleton getInstance(){
	        System.out.println("懒汉式单例模式开始调用公有方法返回实例");
	        if(instance == null){
			System.out.println("-->懒汉式构造函数的实例当前并没有被创建"); 
			synchronized(Singleton.class){
				System.out.println("-->双重检测懒汉式构造函数的实例当前并没有被创建"); 
				if(instance == null){
					instance = new Singleton();
				}else{
					System.out.println("-->懒汉式构造函数的实例已经被创建");
				}
			}
		}else{
			System.out.println("-->懒汉式构造函数的实例已经被创建");
		}
		return instance;
	}
	
	
}

4.静态内部类

这种方式跟饿汉式方式采用的机制类似,但又有不同。两者都是采用了类装载的机制来保证初始化实例时只有一个线程。不同的地方在饿汉式方式是只要Singleton类被装载就会实例化,没有Lazy-Loading的作用,而静态内部类方式在Singleton类被装载时并不会立即实例化,而是在需要实例化时,调用getInstance方法,才会装载SingletonInstance类,从而完成Singleton的实例化。
类的静态属性只会在第一次加载类的时候初始化,所以在这里,JVM帮助我们保证了线程的安全性,在类进行初始化时,别的线程是无法进入的。
优点:避免了线程不安全,延迟加载,效率高。
public class Singleton {
	
	private Singleton(){}
	
	private static class SingletonInstance{
		private static final Singleton INSTANCE = new Singleton();
	}
	
	public static Singleton getInstance(){
		return SingletonInstance.INSTANCE;
	}
}

调侃《Head First 设计模式》之单例模式

对于一个类来说,平常我们可以随便new出无限多个对象(只要内存hold得住),但是像线程池、缓存、对话框、日志对象、设备驱动程序的对象只能有一个对象,如果制造多个实例就会出现问题。比如程序行为异常,资...
  • sinat_23092639
  • sinat_23092639
  • 2015年04月25日 11:02
  • 719

java设计模式之单例模式5种方法及优缺点小结

单例设计模式的用处。单例设计模式是指,某个类只有一个实例。在计算机系统中类似于打印机和最常见的就是任务管理器的对话框,不管几个用户同时登录windows 打开的任务对话框只有一个。常见的几种实现方式:...
  • gwbbigbang
  • gwbbigbang
  • 2017年06月04日 18:27
  • 469

设计模式(创建型)之单例模式(Singleton Pattern)

单例模式可能是23种设计模式中最简单的。应用也非常广泛,譬如Android中的数据库访问等操作都可以运用单例模式。核心概念: 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称...
  • yanbober
  • yanbober
  • 2015年04月27日 16:50
  • 2917

单例模式的好处和缺点?为什么要用单例模式?

单例模式含义】单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资...
  • not_give_up_
  • not_give_up_
  • 2017年08月15日 22:01
  • 1218

Java设计模式之一 单例设计模式

设计模式: 设计模式的概念首先来源于其它行业:建筑业,在早起建房子的时候,肯定是经验缺乏、显得杂乱无序的,这就会造成很多问题,在行业发展过程,通过不断的经验积累,前辈们针对这些问题提出了合理解决方案...
  • qq_32736689
  • qq_32736689
  • 2016年04月07日 08:29
  • 2531

设计模式:这是最全面 & 详细的 单例模式(Singleton)分析指南

前言 今天我来全面总结一下Android开发中最常用的设计模式 - 单例模式。 关于设计模式的介绍,可以看下我之前写的:1分钟全面了解“设计模式” 目录 1. 实例引入...
  • carson_ho
  • carson_ho
  • 2016年08月16日 17:15
  • 4545

C++设计模式[二]单例模式

接着就是单例模式;个人理解就是把创建方法改为私有,然后再内部实例化,禁止外部创建对象。 何为单例模式,在GOF的《设计模式:可复用面向对象软件的基础》中是这样说的:保证一个类只有一个实例,并提供一个...
  • langb2014
  • langb2014
  • 2015年11月03日 16:11
  • 1160

设计模式系列(一)单例模式

一、简单介绍 单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。 《设计模式》书中对单例模式动机的介绍 对于系统中的某些类...
  • robertcpp
  • robertcpp
  • 2016年06月05日 11:00
  • 3531

【Java】设计模式:深入理解单例模式

什么是设计模式?简单的理解就是前人留下来的一些经验总结而已,然后把这些经验起了个名字叫Design Pattern,翻译过来就是设计模式,通过使用设计模式可以让我们的代码复用性更高,可维护性更高,让你...
  • u010983881
  • u010983881
  • 2016年09月08日 14:18
  • 1072

浅谈JavaScript设计模式——单例模式

单例模式的定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。 单例模式是一种常用的模式,有些对象只需要一个,如线程池、全局缓存、浏览器中的window对象等,这时候可以用到单例模式。 单例模...
  • zhouziyu2011
  • zhouziyu2011
  • 2017年04月01日 17:17
  • 478
收藏助手
不良信息举报
您举报文章:设计模式-------单例模式
举报原因:
原因补充:

(最多只允许输入30个字)