单例设计模式
单例模式是Java23种设计模式中最简单的设计模式之一,今天我们就详细讲解一下单例设计模式。
单例模式指的是在实例化对象时,只实例化一次。比如在jdbc中,实例化多个jdbc 连接会极大的占用资源,所以我们在设计程序时考虑到只实例化一个jdbc的对象,这样就能避免实例化多个对象时的尴尬。具体设计方法:
1 package com.devin.learning0612; 2 3 public class Singleton { 4 private static Singleton instence = new Singleton(); 5 private Singleton(){ 6 System.out.println("单例模式"); 7 } 8 public static Singleton getSingleton(){ 9 return instence; 10 } 11 12 13 } 14 class Demo{ 15 public static void main(String[] args) { 16 // Singleton s = new Singleton(); 17 Singleton s = Singleton.getSingleton(); 18 } 19 }
在第五行,通过构造方法私有化使类只能在类内部被实例化,在第4行,通过静态私有化实例化本类,再通过接口完成对对象的调用。
上述代码是饿汉式的单例模式,这种模式无论对象是否被调用,都会实例化一个对象出来,这样做可能会占用资源,但这样做是线程安全的,下面是懒汉式单例模式
1 public class Singleton { 2 private static Singleton instence = null; 3 private Singleton(){ 4 System.out.println("单例模式"); 5 } 6 public static Singleton getSingleton(){ 7 if(instence == null) 8 instence = new Singleton(); 9 return instence; 10 } 11 12 13 } 14 class Demo{ 15 public static void main(String[] args) { 16 // Singleton s = new Singleton(); 17 Singleton s = Singleton.getSingleton(); 18 } 19 }
懒汉式在接口被调用时,再实例化,这样保证了不会被浪费资源,但这样做是线程不安全的,若有多个线程同时调用这个对象,很可能造成实例化冲突,变为以下形式便可解决
1 public class Singleton { 2 private static Singleton instence = null; 3 private Singleton(){ 4 System.out.println("单例模式"); 5 } 6 public static synchronized Singleton getSingleton(){ 7 if(instence == null) 8 instence = new Singleton(); 9 return instence; 10 } 11 12 13 } 14 class Demo{ 15 public static void main(String[] args) { 16 // Singleton s = new Singleton(); 17 Singleton s = Singleton.getSingleton(); 18 } 19 }