8 面向对象编程 8.4单例设计模式
8 面向对象编程
8.4单例设计模式
8.4.1什么是设计模式
- 静态方法和属性的经典使用
- 设计模式是在大量实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。设计模式就像是经典的棋谱,不同的棋局,我们用不同的棋谱,免去我们自己再思考和摸索。
8.4.2 什么是单例模式
单例(单个的实例)
- 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法
- 单例模式有两种方式: 1) 饿汉式 2)懒汉式
8.4.3 单例模式应用实例
演示饿汉式和懒汉式单例模式的实现。
步骤如下:
- 构造器私有化 =》防止直接 new
- 类的内部创建对象
- 向外暴露一个静态的公共方法。getInstance
- 代码实现 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懒汉式
- 二者主要区别在于创建对象的时机不同:饿汉式是在类加载就创建了对象实例,而懒汉式是在使用时才创建。
- 饿汉式不存在线程安全问题,懒汉式存在线程安全问题。
- 饿汉式存在浪费资源的可能。因为程序员一个对象实例都没使用,那么饿汉式创建的对象就浪费了,懒汉式是使用时才创建,就不存在这个问题。
- 我们javaSE标准类中,java.langRuntime就是经典的单例设计模式。