8 面向对象编程 8.4单例设计模式

8 面向对象编程

8.4单例设计模式

8.4.1什么是设计模式

  1. 静态方法和属性的经典使用
  2. 设计模式是在大量实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。设计模式就像是经典的棋谱,不同的棋局,我们用不同的棋谱,免去我们自己再思考和摸索。

8.4.2 什么是单例模式

单例(单个的实例)

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

8.4.3 单例模式应用实例

演示饿汉式和懒汉式单例模式的实现。
步骤如下:

  1. 构造器私有化 =》防止直接 new
  2. 类的内部创建对象
  3. 向外暴露一个静态的公共方法。getInstance
  4. 代码实现 SingleTon01.java SingleTon02.java

代码:

public class SingleTon01 {
    public static void main(String[] args) {
        // 通过单例模式获取对象
        GirlFriend instance = GirlFriend.getInstance();
        System.out.println(instance);
        
        GirlFriend instance2 = GirlFriend.getInstance();
        System.out.println(instance2);
        
        // 验证是否为同一个对象
        System.out.println(instance == instance2); // 输出true
    }
}

// 只能有一个女朋友的类(单例模式)
class GirlFriend {
    private String name;
    
    // 1. 构造器私有化,防止外部直接new
    private GirlFriend(String name) {
        System.out.println("构造器被调用.");
        this.name = name;
    }
    
    // 2. 在类内部直接创建对象(静态成员)
    // 饿汉式:类加载时就创建对象
    private static GirlFriend gf = new GirlFriend("小红红");
    
    // 3. 提供公共的静态方法,返回唯一实例
    public static GirlFriend getInstance() {
        return gf;
    }
    
    @Override
    public String toString() {
        return "GirlFriend{" +
                "name='" + name + '\'' +
                '}';
    }
}

public class SingleTon02 {
    public static void main(String[] args) {
        // 通过单例模式获取Cat对象
        Cat instance = Cat.getInstance();
        System.out.println(instance);
        
        // 再次获取实例
        Cat instance2 = Cat.getInstance();
        System.out.println(instance2);
        
        // 验证是否为同一个对象
        System.out.println(instance == instance2); // 输出true
    }
}

// 采用懒汉式单例模式,确保程序运行过程中只能创建一个Cat对象
class Cat {
    private String name;
    public static int n1 = 999;
    
    // 2. 定义静态属性对象,默认值为null
    private static Cat cat; 
    
    // 1. 构造器私有化,防止外部直接创建对象
    private Cat(String name) {
        System.out.println("构造器调用...");
        this.name = name;
    }
    
    // 3. 提供公共静态方法,返回Cat对象
    // 懒汉式特点:只有当用户调用getInstance()时才创建对象
    public static Cat getInstance() {
        if (cat == null) { // 如果尚未创建对象
            cat = new Cat("小可爱");
        }
        return cat;
    }
    
    @Override
    public String toString() {
        return "Cat{" +
                "name='" + name + '\'' +
                '}';
    }
}
    

8.4.4饿汉式VS懒汉式

  1. 二者主要区别在于创建对象的时机不同:饿汉式是在类加载就创建了对象实例,而懒汉式是在使用时才创建。
  2. 饿汉式不存在线程安全问题,懒汉式存在线程安全问题。
  3. 饿汉式存在浪费资源的可能。因为程序员一个对象实例都没使用,那么饿汉式创建的对象就浪费了,懒汉式是使用时才创建,就不存在这个问题。
  4. 我们javaSE标准类中,java.langRuntime就是经典的单例设计模式。
posted @ 2025-08-10 23:34  *珍惜当下*  阅读(7)  评论(0)    收藏  举报