单例设计模式(★★★★★★) (笔试必考)
(1)基本概念
当一个类对外提供且只提供一个对象时,这样的类叫做单例类。 //比如说要打开任务管理器,只能打开一个,而不能打开多个,
而设计单例类的思想和编程模式叫做 单例设计模式。
(2)实现流程
a.私有化构造方法,使用private关键字修饰;
b.提供本类类型的引用指向本类的对象,使用private static关键字共同修饰;
c.提供公有的get方法负责将对象返回出去,使用static关键字修饰;
(3)实现方式
单例设计模式分为两种:饿汉式 和 懒汉式,在以后的开发中推荐饿汉式。
1 public class Singleton{ 2 3 //1.将自定义无参构造进行private限制 4 //此时在Singleton类外无法直接创建对象,只能在类内创建对象 5 private Singleton(){ 6 7 } 8 9 //2.在类内创建了成员对象后,对其进行private封装,此时该创建的对象属于对象层级; 10 //只可以对象来调用,但是在TestSingleton类中无法创建对象,故使用static来使得 11 //该成员对象转换为类层级,此时可以想通过Singleton.sin 来调用,但由于是private封装 12 //故类外无法调用, 只能令找它法 13 //private static Singleton sin = new Singleton(); //饿汉式单例模式构建单例实体 14 private static Singleton sin = null; //懒汉式单例模式构建单例实例 15 16 //3.可以创建一个类层级的public的公有方法来实现 17 //此时可以在类外通过调用getInstance() 进行获得类中创建的实例 转=>TestSingleton.java 18 public static Singleton getInstance(){ 19 return sin; 20 /*if(sin == null){ //懒汉式单例模式构建单例实例 21 sin = new Singleton(); 22 } 23 return sin;*/ 24 } 25 }
1 /* 2 测试Singleton类,要求Singleton类中 只能创建一个对象 3 4 */ 5 public class TestSingleton{ 6 7 public static void main(String[] args){ 8 9 //此时可以创建不止一个对象,原因在于可以调用编译器提供的 10 //默认的无参构造函数,不受控制,所以需要自定义无参构造函数, 11 //且加private进行封装,此时在Test类中无法用对象的创建来自动调用无参构造 12 //此时可以在Singleton类内直接创建一个对象 转=>Singleton.java 13 /*Singleton s1 = new Singleton(); 14 Singleton s2 = new Singleton(); 15 System.out.println(s1 == s2);*/ 16 Singleton s3 = Singleton.getInstance(); 17 Singleton s4 = Singleton.getInstance(); 18 System.out.println(s3 == s4); //true 说明只创建了一份实例 19 } 20 }
1 /* 2 编程实现Singleton类的封装 3 */ 4 public class Singleton{ 5 6 //2.提供本类类型的引用指向本类的对象 7 //private static Singleton sin = new Singleton(); //饿汉式 8 private static Singleton sin = null; //懒汉式 9 10 //1.私有化构造方法,使用private关键字修饰 11 //表示该构造方法只能在本类的内部使用,不能在类外使用 12 private Singleton(){} 13 14 //3.提供公有的get方法将上述对象返回出去 15 public static Singleton getInstance(){ 16 //return sin; 17 if(null == sin){ 18 sin = new Singleton(); 19 } 20 return sin; 21 } 22 }
1 /* 2 编程实现Singleton类的测试 3 */ 4 public class TestSingleton{ 5 6 public static void main(String[] args){ 7 8 //Singleton s1 = new Singleton(); 9 //Singleton s2 = new Singleton(); 10 //System.out.println(s1 == s2); //false 11 Singleton s1 = Singleton.getInstance(); 12 Singleton s2 = Singleton.getInstance(); 13 System.out.println(s1 == s2); //true 14 } 15 }