设计模式1:单例模式(1)
什么是单例模式?
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
作用:在整个生命周期,一个类的所有对象,都是指向了同一块内存空间,而系统不需要为该类的每一个对象都在堆分配空间。任何时候,单例类的实例只有一个。
单例模式是通过单例类来实现的,其中单例类的构成分为三部分:
1.指定其构造方法为私有的
2.定义一个公有的类变量作为该类的唯一对象
3.公开一个公共方法用来获取这个类的唯一实例
注:类的构造方法我们一般定义为公有的,但它也可以定义为私有,当一个类的构造方法被定义为私有的时候,我们就没法使用这个构造方法了,也就是不能通过这个构造方法来创建该类的对象了,当一个类的所有构造方法都定义为私有,那么我们就无法在该类之外创建这个类的对象,所有就必须提供一个公共的方法,外界通过这个唯一的入口来获取一个已经实例化的类了。
单例模式有两种:
1.饿汉式,线程安全的
2.懒汉式,线程不安全
其中饿汉式和懒汉式的不同仅在于这个类的唯一实例创建的时机,饿汉式是在外界获取这个实例之前就已经初始化了这个实例,而懒汉式则是在外界第一次获取这个实例的时候才初始化这个实例,以后不再初始化,懒汉式是线程不安全的,原因在于当多个线程都开始创建这个对象时,由于cpu是采用时间片轮转法,可能会返回单例类对象的多个引用,从而导致线程不安全。
饿汉式:
1 class SingleInstance{ 2 //定义一个本类的对象 3 private static SingleInstance singleInstance = new SingleInstance(); 4 5 //构造方法私有化:不能在本类的外部通过new创建对象 6 private SingleInstance(){ 7 8 } 9 10 //向外界提供可访问的方法,返回当前类的对象 11 public static SingleInstance getInstance(){ 12 return singleInstance; 13 } 14 }
懒汉式:
1 class SingleInstance{ 2 //定义一个本类的对象 3 private static SingleInstance singleInstance; 4 5 //构造方法私有化:不能在本类的外部通过new创建对象 6 private SingleInstance(){ 7 8 } 9 10 //向外界提供可访问的方法,返回当前类的对象 11 public static SingleInstance getInstance(){ 12 if(singleInstance==null) 13 singleInstance = new SingleInstance(); 14 return singleInstance; 15 } 16 }
示例:创建单例类的两个对象,判断这两个对象的引用是否相同。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.pattern; 2 3 public class Test1 { 4 public static void main(String[] args) { 5 //创建两个对象 6 SingleInstance singleInstance1 = SingleInstance.getInstance(); 7 SingleInstance singleInstance2 = SingleInstance.getInstance(); 8 9 //打印这两个引用所指向的对象地址 10 System.out.println("singleInstance1:"+singleInstance1); 11 System.out.println("singleInstance2:"+singleInstance2); 12 System.out.println(singleInstance1==singleInstance2); 13 14 } 15 } 16 class SingleInstance{ 17 //定义一个本类的对象 18 private static SingleInstance singleInstance = new SingleInstance(); 19 20 //构造方法私有化:不能在本类的外部通过new创建对象 21 private SingleInstance(){ 22 23 } 24 25 //向外界提供可访问的方法,返回当前类的对象 26 public static SingleInstance getInstance(){ 27 return singleInstance; 28 } 29 }
效果:
单例模式的应用场景:
(图片来源:http://blog.csdn.net/tanyujing/article/details/14160941)
未完,待续。