单例设计模式
免责声明:java基础资料均来自于韩顺平老师的《循序渐进学Java零基础》教案,具体视频内容可以去B站观看,这些资料仅用于学习交流,不得转载用于商业活动
单例设计模式
1.1 什么是设计模式
静态方法和属性的经典使用
设计模式是在大量的实践中总结和理论化之后优选的代码结构、编码风格、以及解决问题的思考方式。
1.2 什么是单例模式
单例(单个的实例)
- 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法
- 单例模式有两种方式:1)饿汉式2)懒汉式
1.3 单例模式的应用实例
演示饿汉式和懒汉式单例模式的实现
步骤如下:
- 构造器私有化=>防止直接new
- 类的内部创建对象
- 向外暴露一个静态的公共方法
1.4 应用
1.4.1 饿汉式
1 public class SingleTon01 { 2 public static void main(String[] args) { 3 //Wife xh = new Wife("小红"); 4 //Wife xb = new Wife("小白"); 5 6 //通过方法可以获取对象 7 Wife wife = Wife.getInstance(); 8 System.out.println(wife); 9 Wife wife1 = Wife.getInstance(); 10 System.out.println(wife1); 11 System.out.println(wife == wife1); 12 // System.out.println(Wife.n1); 13 } 14 } 15 16 //有一个类,Wife 17 //只能有一个老婆 18 class Wife{ 19 private String name; 20 //public static int n1 = 100; 21 //为了能够在静态方法中,返回wife对象,需要将其修饰为static 22 //对象,通常是重量级的对象,饿汉式可能造成创建了对象,但是没有使用 23 private static Wife wife = new Wife("小红"); 24 //如何保障我们只能创建一个Wife对象 25 //步骤【单例模式-饿汉式】 26 //1.将构造器私有化 27 //2.在类的内部直接创建对象(该对象是static) 28 //3.提供一个公共的static方法,返回wife对象 29 private Wife(String name){ 30 System.out.println("构造器被调用"); 31 this.name = name; 32 } 33 34 public static Wife getInstance(){ 35 return wife; 36 } 37 @Override 38 public String toString(){ 39 return "Wife{+name="+name+"}"; 40 } 41 }
1.4.1 懒汉式
1 public class SingleTon02 { 2 public static void main(String[] args) { 3 //new Dog("小灰"); 4 System.out.println(Dog.n1); 5 Dog dog = Dog.getInstance(); 6 System.out.println(dog); 7 8 //再次调用getInstance 9 Dog dog1 = Dog.getInstance(); 10 System.out.println(dog1); 11 System.out.println(dog == dog1); 12 } 13 } 14 15 //希望在程序运行过程中,只能创建一个Dog对象 16 //使用单例模式 17 class Dog{ 18 private String name; 19 public static int n1 = 999; 20 private static Dog dog;//默认是null 21 22 //步骤 23 //1.仍然构造器私有化 24 //2.定义一个static 静态属性对象 25 //3.提供一个public的static方法,可以返回一个Dog对象 26 //4.懒汉式,只有当用户使用getInstance时,才返回cat对象,后面再次调用时,会返回上次创建的cat对象 27 //从而保障了单例 28 private Dog(String name){ 29 System.out.println("构造器被调用"); 30 this.name = name; 31 } 32 public static Dog getInstance(){ 33 if(dog == null){//如果还没有创建dog对象 34 dog = new Dog("大黄"); 35 } 36 return dog; 37 } 38 39 @Override 40 public String toString() { 41 return "Dog{" + 42 "name='" + name + '\'' + 43 '}'; 44 } 45 }
1.5 饿汉式 VS 懒汉式
二者最主要的区别在于创建对象的时机不同:饿汉式是在类加载就创建了对象实例,而懒汉式是在使用时才创建
饿汉式不存在线程安全问题,懒汉式存在线程安全问题
饿汉式存在浪费资源的可能,因为如果程序员一个对象实例都没有使用,那么饿汉式创建的对象就浪费了,懒汉式是使用时才创建,就不存在这个问题