1. 什么是单例设计模式 391
单例(单个的实例)
1. 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例, 并且该类只提供一个取得其对象实例的方法
2. 单例模式有两种方式: 1)饿汉式2)懒汉式
2. 单例设计模式实例应用 391
2.1 饿汉式 391
保证只能有一个女朋友
饿汉式单例模式的实现。
步骤如下:
1)构造器私有化—>防止直接new
2)类的内部创建对象
3)向外暴露一个静态的公共方法。(getinstance)
代码在com.stulzl.single_.包中
SingleTon01
package com.stulzl.single_Ton01;
//单例设计模式实例应用演示饿汉式 391
//保证只能有一个女朋友
public class SingleTon01 {
public static void main(String[] args) {
//通过方法可以获取对象
//因为返回类型是GirlFriend,所以接收也得一样(注:接收的是对象gf,不是名字)
GirlFriend instance = GirlFriend.getInstance();
System.out.println(instance);
//在调用一次
GirlFriend instance2 = GirlFriend.getInstance();
System.out.println(instance2);//二者输出一样,因为静态变量初始化只会被创建一次
//System.out.println(GirlFriend.n1);//输出GirlFriend(String name) 被调用……
//999
//上句就证明,我们没用到gf对象,但是我们使用n1时,涉及到了类的加载,由于gf存在静态
//属性初始化,所以也会被创建,造成资源浪费
}
}
//有一个类, GirlFriend
//只能有一个女朋友
class GirlFriend{
private String name;
//public static int n1 = 999;
//如何保障我们只能创建一个 GirlFriend 对象
//步骤[单例模式-饿汉式]
//1. 将构造器私有化
//2. 在类的内部直接创建对象(该对象是 static)
//3. 提供一个公共的 static 方法,返回 gf 对象
private GirlFriend(String name) {
//System.out.println("GirlFriend(String name) 被调用……");
= name;
}
//为了能够在静态方法中,返回 gf 对象,需要将其修饰为 static
//對象,通常是重量級的對象, 餓漢式可能造成創建了對象,但是沒有使用.
private static GirlFriend gf = new GirlFriend("小红");//(静态变量初始化) 之所以叫饿汉式,是因为,
// 这个gf对象可能都没用到,但是在类加载时就会被创建好了
//这里解释这个方法为什么是静态的,因为我们的构造器被私有化了,所以创建不了对象
//因只有静态的方法才可以不创建对象而直接调用,所以巧妙地利用了静态方法
public static GirlFriend getInstance(){
return gf;//返回类型GirlFriend,注意返回的是对象不是名字,要想名字,写一个toString语句
}
@Override
public String toString() {
return "GirlFriend{" +
"name='" + name + '\'' +
'}';
}
}
2.2 懒汉式392
保证只能养一只猫
步骤
1. 将构造器私有化
2. 定义一个static静态对象
3. 提供一个public的static方法,返回对象
代码在com.stulzl.single_Ton02.包中
SingleTon02
package com.stulzl.single_Ton02;
//单例设计模式实例应用演示懒汉式 392
//保证只能养一只猫
public class SingleTon02 {
public static void main(String[] args) {
Cat instance = Cat.getInstance();//接收猫对象
System.out.println(instance);
//再次调用
Cat instance2 = Cat.getInstance();//接收猫对象
System.out.println(instance2);
}
}
//希望在程序运行过程中,只能创建一只猫Cat对象
//使用单例模式
class Cat{
private String name;
private static Cat cat;//没赋值默认为null
//步骤
//1. 将构造器私有化
//定义一个static静态对象
//提供一个public的static方法,返回Cat对象
//4.懶漢式,只有當用戶使用 getInstance 時,才返回 cat 對象, 後面再次調用時
// ,會返回上次創建的 cat 對象
// 從而保證了單例
private Cat(String name) {
= name;
}
public static Cat getInstance(){
if(cat==null){//如果没有创建猫对象
cat = new Cat("小可爱");
}
return cat;
}
@Override
public String toString() {
return "Cat{" +
"name='" + name + '\'' +
'}';
}
}
3. 饿汉式 VS 懒汉式 392
1.二者最主要的区别在于创建对象的时机不同:饿汉式是在类加载就创建了对象实例,而懒汉式是在使用时才创建。
2.饿汉式不存在线程安全问题,懒汉式存在线程安全问题。(后面学习线程后,会完善把)
3. 饿汉式存在浪费资源的可能。因为如果程序员个对象实例都没有使用,那么饿汉式创建的对象就浪费了,懒汉式是使用时才创建,就不存在这个问题。
4. 在我们javaSE标准类中,java.lang.Runtime就是经典的单例模式。