设计模式
1. 什么是设计模式
- 设计模式是静态方法和静态属性的经典使用。
- 设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。设计模式就像是经典的棋谱,不同的棋局,我们可以使用不同的棋谱,免去了我们自己的摸索。
2. 什么是单例模式
- 单例(单个的示例)
- 所谓类的单例设计模式,就是采取一定的方法保证在整个的团软件系统中,对某个类的只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。
- 单例模式有两种方式:(1)饿汉式;(2)懒汉式。
3. 饿汉式单例模式的实现
- 具体步骤:
(1)将类的构造器私有化,防止其他类直接创建该类对象。
(2)在类的内部创建一个 static 对象。
(3)该类向外提供一个静态的公共方法,返回 static 对象。
- 代码实现:
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);// instance和instance2 其实是同一个对象
System.out.println(instance == instance2);// true
}
}
// GirlFriend 类
// 要求只能有一个女朋友
class GirlFriend {
private String name;
//为了能够在静态方法中,返回 gf 对象,需要将其修饰为 static
//對象,通常是重量級的對象, 餓漢式可能造成創建了對象,但是沒有使用,造成资源的浪费
private static GirlFriend gf = new GirlFriend("小红红");
//如何保障我们只能创建一个 GirlFriend 对象
//步骤[单例模式-饿汉式]
//1. 将构造器私有化,防止其他类直接创建该类对象
//2. 在类的内部直接创建对象(该对象是static)
//3. 提供一个公共的static方法,返回 gf 对象
private GirlFriend(String name) {
System.out.println("構造器被調用...");
this.name = name;
}
public static GirlFriend getInstance() {
return gf;
}
@Override
public String toString() {
return "GirlFriend{" +
"name='" + name + '\'' +
'}';
}
}
- 思考:
(1)为什么要将公共的访问对象的方法 getInstance() 设置成静态方法,去掉static 可以吗?
- 不可以,我们想要在其他类中不创建该类的对象就可以调用该方法,因此只能将其设置为静态方法。
(2)为什么要类中创建 static 的对象,去掉static 修饰符可以吗?
- 不可以,在类中访问对象的方法 getInstance() 是静态方法,其只能返回静态的属性,因此只能将对象设置成 静态对象。
(3)饿汉式的弊端是什么?
- 弊端在于:在类加载时,该对象就会被自动创建了,无论有无使用该对象,它都存在,会造成资源的浪费。
4. 懒汉式单例模式的实现
- 具体步骤:
(1)将类的构造器私有化,防止其他类直接创建该类对象。
(2)在类的内部声明一个 static 对象,但没有真正创建对象空间。
(3)该类向外提供一个静态的公共方法,返回 static 对象。
(4)只有当用户第一次使用公共方法时,才创建对象空间;后面再次使用时,返回上次创建的对象。
- 代码实现:
public class SingleTon02 {
public static void main(String[] args) {
Cat instance = Cat.getInstance();
System.out.println(instance);
//再次調用 getInstance
Cat instance2 = Cat.getInstance();
System.out.println(instance2);
System.out.println(instance == instance2);// True
}
}
//希望在程序運行過程中,只能創建一個Cat對象
//Cat 类
class Cat {
private String name;
private static Cat cat; // 默認是null,并未真正创建对象空间
// 步驟
//(1)将类的构造器私有化,防止其他类直接创建该类对象。
//(2)在类的内部声明一个 static 对象,但没有真正创建对象空间。
//(3)该类向外提供一个静态的公共方法,返回 static 对象。
//(4)只有当用户第一次使用公共方法时,才创建对象空间;后面再次使用时,返回上次创建的对象。
// 從而保證了單例
private Cat(String name) {
System.out.println("構造器調用...");
this.name = name;
}
public static Cat getInstance() {
if(cat == null) {//如果還沒有創建cat對象
cat = new Cat("小可愛");
}
return cat;
}
@Override
public String toString() {
return "Cat{" +
"name='" + name + '\'' +
'}';
}
}
5. 饿汉式和懒汉式的比较
- 如下图:
总结
- 本文是小白博主在学习B站韩顺平老师的Java网课时整理总结的学习笔记,在这里感谢韩顺平老师的网课,如有有兴趣的小伙伴也可以去看看。
- 本文详细解释了设计模式中的单例模式的概念与使用,并深入讲解了饿汉式和懒汉式单例设计模式的使用和区别,希望小伙伴们看后能有所收获!
- 最后,如果本文有什么错漏的地方,欢迎大家批评指正!一起加油!!我们下一篇博文见吧!