Java的23种设计模式之单列设计模式

news/2024/7/6 6:31:44
  1. 饿汉式单列模式类:在这个类每次加载到内存中就直接把instance实例化好了
package com.xianyu.singleton;

/**
 * @author xianyu
 * @version 1.0
 * @date 2020/3/12 16:35
 * 设计模式1: 单列设计模式
 */
public class Program1 {

    public static void main(String[] args) {

        // 4. 通过单列类中指定的方法进行对象的获取
        User user = User.getUser();
        for (int i = 0; i < 1000; i++) {
            User u = User.getUser();
            if(user != u){
                System.out.println("生成新的对象");
            }
        }
        System.out.println("程序结束");
    }

}



// 饿汉式单列模式类, 使其在程序中有且只能有一个实例
// 饿汉式单列模式类:在这个类每次加载到内存中就直接把instance实例化好了

class User{

    // 1. 私有化构造器
    private User(){}

    // 2. 设计一个私有的静态的当前类的对象
    private static User instance = new User();

    // 或者静态代码块
//    static{
//        instance = new User();
//    }



    // 3. 提供一个方法,可以返回给调用方能够获取当前类的对象
    public static User getUser(){
        //return new User(); // 注意这个是错的
        return instance;
    }


}

在这里插入图片描述

  1. 懒汉式
package com.xianyu.singleton;

/**
 * @author xianyu
 * @version 1.0
 * @date 2020/3/12 16:50
 * 懒汉式单列设计模式
 */
public class Program2 {

    public static void main(String[] args) {

        // 4. 通过单列类中指定的方法进行对象的获取
        Person person = Person.getPerson();
        for (int i = 0; i < 1000; i++) {
            Person p = Person.getPerson();
            if(person != p){
                System.out.println("生成新的对象");
            }
        }
        System.out.println("程序结束");
    }


}



// 懒汉式单列设计模式

class Person{

    // 1. 私有化构造方法
    private Person(){}

    // 2. 设计一个私有的静态的当前类的对象
    private static Person instance;  // 声明时未直接实例化

    // 3. 提供一个静态的可以获取该对象实例的方法
    public static Person getPerson(){
        if(instance == null){
            instance = new Person();  // 懒汉式,等调用时才实例化对象
        }
        return instance;
    }

}

在这里插入图片描述

  1. 懒汉式单列设计模式在多线程中的问题
package com.xianyu.singleton;

/**
 * @author xianyu
 * @version 1.0
 * @date 2020/3/12 17:00
 * 懒汉式单列设计模式在多线程中的问题
 */
public class Program3 {

    public static void main(String[] args) {
        for (int i = 0; i < 1000; i++) {
            Thread t = new Thread(()->{
                Teacher.getTeacher();
            });
            t.start();
        }
    }

}


class Teacher{

    private Teacher(){
        System.out.println("**********调用构造器*********");
    };

    private static Teacher instance;

    public static synchronized Teacher getTeacher(){  // 解决方法:同步方法
        if(instance == null){                         // 这里会出现问题,判断后阻塞了
            instance = new Teacher();
        }
        return instance;
    }


}


http://www.niftyadmin.cn/n/1791012.html

相关文章

vue-cli keep-alive用法以及activated,deactivated

keep-alive用法 <keep-alive>是Vue的内置组件&#xff0c;能在组件切换过程中将状态保留在内存中&#xff0c;防止重复渲染DOM。 include: 字符串或正则表达式。只有匹配的组件会被缓存。exclude: 字符串或正则表达式。任何匹配的组件都不会被缓存。import Vue from vue …

小型电子声光礼花器电子烟花爆竹电路设计

节日和庆典时燃放礼花&#xff0c;其绚丽缤纷的图案&#xff0c;热烈的爆炸声、欢乐的气氛&#xff0c;能给人们留下美好的印象&#xff0c;但有一定的烟尘污染和爆炸危险隐患。本电路可以模拟礼花燃放装置&#xff0c;达到声型兼备的效果&#xff0c;给人们在安全、环保的环境…

spring boot 配置 JPA

application.properties的配置 spring.datasource.platformpostgres spring.datasource.urljdbc:postgresql://localhost:5432/to_database spring.datasource.usernamepostgres spring.datasource.password123456789 spring.jpa.properties.hibernate.dialect org.hibernate.…

字节顺序

字节顺序 #include <stdio.h>typedef int* int_ptr; typedef unsigned char* byte_ptr;void show_bytes( byte_ptr start, int len ){int i;for( i 0; i < len; i ){printf( " %4.2x", start[i] );}printf( "\n" );}void show_int( int x ){show…

Java原型模式--拷贝

package com.xianyu.prototype;import java.util.Date;/*** author xianyu* version 1.0* date 2020/3/15 21:36* 复制视频源文件* 1. 实现一个接口* 2. 重写一个方法*/ public class Video implements Cloneable{ // 实现一个接口private String name;private Date createTim…

GPA低于2.0被开除

GPA低于2.0被开除&#xff08; Q 575121832&#xff09; GPA太低会被开除吗&#xff1f; GPA是衡量学生学术水平的一个重要指标。一般而言&#xff0c;如果连续两学期&#xff0c;本科生的GPA达不到2.0、研究生的GPA达不到3.0&#xff0c;都有可能面临被学校劝退或开除的情况。…

5294 挖地雷

5294 挖地雷 时间限制: 1 s 空间限制: 1000 KB题目等级 : 黄金 Gold题目描述 Description在一个地图上有N个地窖&#xff08;N<20&#xff09;&#xff0c;每个地窖中埋有一定数量的地雷。同时&#xff0c;给出地窖之间的连接路径。当地窖及其连接的数据给出之后&#xff0c…

sysbench的框架实现介绍

sysbench是一个非常经典的综合性能测试工具&#xff0c;它支持CPU&#xff0c;IO&#xff0c;内存&#xff0c;尤其是数据库的性能测试。那它是怎么做到通用性的呢&#xff0c;总结一句话是大量运用了重载的方法。 sysbench总体架构 sysbench是一个总体框架&#xff0c;它用来操…