单例设计模式

免责声明:java基础资料均来自于韩顺平老师的《循序渐进学Java零基础》教案,具体视频内容可以去B站观看,这些资料仅用于学习交流,不得转载用于商业活动

单例设计模式

1.1 什么是设计模式

静态方法和属性的经典使用

设计模式是在大量的实践中总结和理论化之后优选的代码结构、编码风格、以及解决问题的思考方式。

1.2 什么是单例模式

单例(单个的实例)

  1. 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法
  2. 单例模式有两种方式:1)饿汉式2)懒汉式

1.3 单例模式的应用实例

演示饿汉式和懒汉式单例模式的实现

步骤如下:

  1. 构造器私有化=>防止直接new
  2. 类的内部创建对象
  3. 向外暴露一个静态的公共方法

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 懒汉式

二者最主要的区别在于创建对象的时机不同:饿汉式是在类加载就创建了对象实例,而懒汉式是在使用时才创建

饿汉式不存在线程安全问题,懒汉式存在线程安全问题

饿汉式存在浪费资源的可能,因为如果程序员一个对象实例都没有使用,那么饿汉式创建的对象就浪费了,懒汉式是使用时才创建,就不存在这个问题

posted @ 2024-07-09 16:26  万溪汇海  阅读(6)  评论(0编辑  收藏  举报