创建者模式分为:
创建型模式的主要关注点是"怎样创建对象? ”,它的主要特点是"将对象的创建与使用分离”。
这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。
1、单例设计模式
单例模式(Singleton Pattern)是Java中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
1.1、单例模式的结构
单例模式的主要有以下角色:
- 单例类。只能创建一个实例的类
- 访问类。测试类(用户)使用单例类
1.2、单例模式的实现
-
单例设计模式分类两种:
- 饿汉式:类加载就会导致该单实例对象被创建
- 懒汉式:类加载不会导致该单实例对象被创建,而是首次使用该对象时才会创建
①饿汉式
单例类代码
public class Singleton {
// 1.创建私用的构造方法
private Singleton(){}
// 2.在本类中创建苯类对象
private static Singleton instance = new Singleton();
// 3.提供一个公共的访问方式,让外界后去改对象
// 静态的不能直接访问非静态的
public static Singleton getInstance(){
return instance;
}
}
测试类代码
public class Client {
public static void main(String[] args) {
// 创建Singleton类的对象
Singleton instance = Singleton.getInstance();
Singleton instance1 = Singleton.getInstance();
// 判断获取到的两个是否是同一个对象
System.out.println(instance == instance1); //true,说明只能创建一个Singleton对象
}
}
-
说明
- 该方式在成员位置声明singleton类型的静态变量,并创建Singleton类的对象instance。instance对象是随着类的加载而创建的。如果该对象足够大的话,而一直没有使用就会造成内存的浪费,因为每new一个对象,实质上是在堆内存中开辟一块地址内存。
②懒汉式
单例类代码
public class Singleton {
//私有构造方法
private Singleton(){}
//声明Singleton类型的变量
private static Singleton instance; //只是声明一个Singleton变量并没有进行赋值
//对外提供访问方法
public static synchronized Singleton getInstance() {
//判断instance是否为null,如果为null,说明还没有创建Singleton类的对象
if(instance == null){
//线程1等待,线程2获取到cpu的执行权,他会进入到该判断里面,所以在上面要加上synchronized(同步锁)关键字,
//这样只有当线程1结束之后,线程2才能进入getInstance()方法里面来
instance = new Singleton();
}
return instance;
}
}
测试类代码
public class Client {
public static void main(String[] args) {
//创建Singleton类的对象
Singleton instance = Singleton.getInstance();
Singleton instance1 = Singleton.getInstance();
//判断获取到的两个是否是同一个对象
System.out.println(instance == instance1); //true,说明只能创建一个Singleton对象
}
}
-
说明
-
该方式也实现了懒加载效果,同时又解决了线程安全问题。但是在
getInstance()
方法上添加了synchronized
关键字,该方法的执行效果特别低。从上面代码我们可以看出,其实就是在初始化instance的时候才会出现线程安全问题,一旦初始化完成就不存在了。