1设计模式
1.1什么是设计模式
软件设计模式(Software Design Pattern),又称设计模式,是一套被==反复使用==、==多数人知晓的==、==代码设计经验的总结==。它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案。也就是说,它是解决特定问题的一系列套路,是==前辈们的代码设计经验的总结==,具有一定的普遍性,可以反复使用。
1.2 设计模式的种类23种
-
创建型模式
用于描述“怎样创建对象”,它的主要特点是“==将对象的创建与使用分离==”。GoF(四人组)书中提供了==单例、原型、工厂方法、抽象工厂、建造者==等 5 种创建型模式。
-
结构型模式
用于描述如何将类或对象按某种布局组成更大的结构,GoF(四人组)书中提供了==代理、适配器、桥接、装饰、外观、享元、组合==等 7 种结构型模式。
-
行为型模式
用于描述类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务,以及怎样分配职责。GoF(四人组)书中提供了==模板方法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录、解释器==等 11 种行为型模式。
1.3 单例模式
-
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于==创建型模式==,它提供了一种==创建对象的最佳方式==。
这种模式涉及到一个单一的类,==该类负责创建自己的对象==,同时==确保只有单个对象被创建==。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
-
单例模式的创建方式
第一种:饿汉式--->不管是否使用该对象,该类会直接创建。
第二种: 懒汉式--->当使用到该对象在创建
饿汉式-方式1(静态变量方式)
package com.qy151;
/**
* @BelongsProject: 0912-设计模式
* @BelongsPackage: com.qy151
* @unthor : YSH
* @date : 2022/9/13 14:42
*/
public class 饿汉式 {
public static void main(String[] args) {
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
Singleton s3 = Singleton.getInstance();
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
}
}
//创建一个单列类
class Singleton{
//构造私有方法
private Singleton(){};
//创建一个本类的对象---static:随着类的加在而被加在到内存而且只会加载一次
private static Singleton singleton=new Singleton();
//静态方法
public static Singleton getInstance(){
return singleton;
}
}
<font color='red'>说明:</font>
该方式在成员位置声明Singleton类型的静态变量,并创建Singleton类的对象instance。instance对象是随着类的加载而创建的。如果该对象足够大的话,而一直没有使用就会造成内存的浪费。
2.懒汉式-方式1(线程不安全)
package com.qy151;
/**
* @BelongsProject: 0912-设计模式
* @BelongsPackage: com.qy151
* @unthor : YSH
* @date : 2022/9/13 19:19
* 线程不安全
*
* 从上面代码我们可以看出该方式在成员位置声明Singleton类型的静态变量,
* 并没有进行对象的赋值操作,那么什么时候赋值的呢?当调用getInstance()方法获取Singleton类的对象的时候才创建Singleton类的对象,
* 这样就实现了懒加载的效果。但是,如果是多线程环境,会出现线程安全问题。
*/
public class 懒汉式01 {
public static void main(String[] args) {
Singleton01 s1 = Singleton01.getInstance();
Singleton01 s2 = Singleton01.getInstance();
System.out.println(s1);
System.out.println(s2);
}
}
//创建一个单例类
class Singleton01{
//构造方法私有化---
private Singleton01(){}
//创建一个本类的对象---static:随着类的加在而被加在到内存而且只会加载一次
private static Singleton01 singleton;
//静态方法 返回本类创建的类对象
public static Singleton01 getInstance(){
if(singleton==null){
singleton=new Singleton01();
}
return singleton;
}
}
从上面代码我们可以看出该方式在成员位置声明Singleton类型的静态变量,并没有进行对象的赋值操作,那么什么时候赋值的呢?当调用getInstance()方法获取Singleton类的对象的时候才创建Singleton类的对象,这样就实现了懒加载的效果。但是,如果是多线程环境,会出现线程安全问题。
懒汉式-方式2(线程安全)
package com.qy151;
/**
* @BelongsProject: 0912-设计模式
* @BelongsPackage: com.qy151
* @unthor : YSH
* @date : 2022/9/13 19:32
*
* 进行加锁&#