Java设计模式之--------创建者模式之--------单例模式

创建者模式分为:

  • 单例设计模式
  • 工厂模式
  • 原型模式
  • 建造者模式

创建型模式的主要关注点是"怎样创建对象? ”,它的主要特点是"将对象的创建与使用分离”。

这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。


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的时候才会出现线程安全问题,一旦初始化完成就不存在了。

你可能感兴趣的:(Java笔记,java,设计模式)