本文主要讲述java的饿汉和懒汉设计模式

饿汉和懒汉设计模式的目的:使得该类的对象,只能有一个,不允许其他类,创建该类的对象。

  • 饿汉设计模式

  示例代码如下:

 1 public class HungerModel {
2 public static void main(String[] args) {
3 // GirlFriend girlFriend1 = new GirlFriend("white", 34);
4 // GirlFriend girlFriend2 = new GirlFriend("jack", 20);
5 // System.out.println(girlFriend1);
6 // System.out.println(girlFriend2);
7 GirlFriend girlFriend1 = GirlFriend.getInstance();
8 System.out.println(girlFriend1);
9
10 GirlFriend girlFriend2 = GirlFriend.getInstance();
11 System.out.println(girlFriend2);
12
13 System.out.println(girlFriend1 == girlFriend2);
14
15 }
16
17 }
18
19 // 只能有一个女朋友,即只能创建一个girlfriend对象?
20
21 class GirlFriend {
22 private String name;
23 private int age;
24 private static GirlFriend girl = new GirlFriend("布尔玛",20);
25
26 /**
27 * (1) 将构造器私有化,不允许其他类调用该构造器
28 * (2) 类中创建该对象实例,私有化,设置为静态,使用无需创建对象,直接用类.静态变量访问.
29 * (3) 提供static公共方法,返回实例对象
30 * @param name
31 * @param age
32 */
33
34 public static GirlFriend getInstance(){
35 return girl;
36 }
37
38 private GirlFriend(String name, int age) {
39 this.name = name;
40 this.age = age;
41 }
42
43 @Override
44 public String toString() {
45 return "GirlFriend{" +
46 "name='" + name + '\'' +
47 ", age=" + age +
48 '}';
49 }
50 }

  运行结果如下:

  • 懒汉设计模式

  示例代码如下:

public class LazyModel {
public static void main(String[] args) {
GirlFriend_ girlFriend1 = GirlFriend_.getInstance();
System.out.println(girlFriend1); GirlFriend_ girlFriend2 = GirlFriend_.getInstance();
System.out.println(girlFriend2); System.out.println(girlFriend1 == girlFriend2);
}
}
class GirlFriend_ {
private String name;
private int age;
private static GirlFriend_ girlFriend ; // 默认初始值为null /**
* (1) 构造器私有化
* (2) 类成员中添加对象引用,static ,private,不要直接new,
* (3) 提供公共方法,返回对象实例 ,public,判断当前对象是否为空,
* 若为空,则创建,若不为空,直接返回该对象。
* @param name
* @param age
*/ private GirlFriend_(String name, int age) {
this.name = name;
this.age = age;
} public static GirlFriend_ getInstance(){
if(girlFriend == null){
girlFriend = new GirlFriend_("布尔玛",20);
}
return girlFriend;
} @Override
public String toString() {
return "GirlFriend_{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}

  运行结果如下:

饿汉和懒汉模式的区别:

  饿汉模式,由于直接在类静态成员变量初始化时,创建该类的对象,导致该类对象随着类的存在,一直存在,有可能该对象一直得不到使用,因此饥饿,造成资源浪费;

  示例代码如下:

public class HungerModel {
public static void main(String[] args) {
System.out.println(GirlFriend.id); } } // 只能有一个女朋友,即只能创建一个girlfriend对象? class GirlFriend {
private String name;
private int age;
public static int id = 1001;
private static GirlFriend girl = new GirlFriend("布尔玛",20); /**
* (1) 将构造器私有化,不允许其他类调用该构造器
* (2) 类中创建该对象实例,私有化,设置为静态,使用无需创建对象,直接用类.静态变量访问.
* (3) 提供static公共方法,返回实例对象
* @param name
* @param age
*/ public static GirlFriend getInstance(){
return girl;
} private GirlFriend(String name, int age) {
this.name = name;
this.age = age;
System.out.println("GirlFriend类的private GirlFriend(String name, int age)构造器被调用");
} @Override
public String toString() {
return "GirlFriend{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}

  运行结果如下:

由此看出,没有使用该对象,但是该对象仍然被创建,浪费资源。

  懒汉模式,先声明静态变量【对象的引用】,在公共方法【返回对象】时,判断当前对象是否为空,若为空,则创建该对象,返回对象实例,这样,当调用该对象时,才会创建对象,不会造成资源浪费。

  示例代码如下:

 1 public class LazyModel {
2 public static void main(String[] args) {
3 System.out.println(GirlFriend_.id);
4 System.out.println(GirlFriend_.getInstance());
5 }
6 }
7 class GirlFriend_ {
8 private String name;
9 private int age;
10 public static int id = 1002;
11 private static GirlFriend_ girlFriend ; // 默认初始值为null
12
13 /**
14 * (1) 构造器私有化
15 * (2) 类成员中添加对象引用,static ,private,不要直接new,
16 * (3) 提供公共方法,返回对象实例 ,public,判断当前对象是否为空,
17 * 若为空,则创建,若不为空,直接返回该对象。
18 * @param name
19 * @param age
20 */
21
22 private GirlFriend_(String name, int age) {
23 this.name = name;
24 this.age = age;
25 System.out.println("GirlFriend_类的private GirlFriend_(String name, int age)构造器被调用");
26 }
27
28 public static GirlFriend_ getInstance(){
29 if(girlFriend == null){
30 girlFriend = new GirlFriend_("布尔玛",20);
31 }
32 return girlFriend;
33 }
34
35 @Override
36 public String toString() {
37 return "GirlFriend_{" +
38 "name='" + name + '\'' +
39 ", age=" + age +
40 '}';
41 }
42 }

  运行结果如下:

java的饿汉和懒汉设计模式的更多相关文章

  1. 瞎扯设计模式1:单例模式 饿汉模式 懒汉模式 线程安全的单例 singleton 设计模式 java

    [原创声明]此文为本人原创,欢迎转载,转载请注明出处,作者链接~ http://www.cnblogs.com/m-yb/p/8833085.html 单例很常用,面试也经常被问,如:不用自定义锁怎么 ...

  2. java 设计模式 单例模式之饿汉模式/懒汉模式 singleton pattern

    https://v.qq.com/x/page/e0364ung5zp.html 讲的不错, 关于 饿汉式单例模式 code Student 类: package com.test;//单例模式之   ...

  3. Java单例模式的各种实现(饿汉、懒汉、静态内部类、static代码块、enum枚举类型)

    饿汉模式 饿汉模式就是立即加载,在方法调用前,实例就已经被创建了,所以是线程安全的. public class MyObject1 { private static MyObject1 myObjec ...

  4. Spring中单例模式中的饿汉和懒汉以及Spring中的多例模式

    链接:https://pan.baidu.com/s/1wgxnXnGbPdK1YaZvhO7PDQ 提取码:opjr 单例模式:每个bean定义只生成一个对象实例,每次getBean请求获得的都是此 ...

  5. Java设计模式 - 单例模式 (懒汉方式和饿汉方式)

    概念: Java中单例模式是一种常见的设计模式,单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 单例模式的写法有好几种,这 ...

  6. Java中单例设计模式,饿汉式和懒汉式

    Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯 ...

  7. C++的单例模式与线程安全单例模式(懒汉/饿汉)

    1 教科书里的单例模式 我们都很清楚一个简单的单例模式该怎样去实现:构造函数声明为private或protect防止被外部函数实例化,内部保存一个private static的类指针保存唯一的实例,实 ...

  8. Java中如果把构造方法也私有化,如何创建对象?Java的单例设计模式——饿汉式和懒汉式区别

    Java的单例模式——饿汉式 package com.swift; //Java单例设计模式——恶汉式 public class SinglePerson { private String name= ...

  9. Java中常用来处理时间的三个类:Date、Calendar、SimpleDateFormate,以及Java中的单例设计模式:懒汉式、饿汉式以及静态内部类式

    (一)java.util.Date类 1.该类有一个long类型的属性:用来存放时间,是用毫秒数的形式表示,开始的日期是从1970年1月1号 00:00:00.    2.该类的很多方法都已经过时,不 ...

  10. java设计模式单例模式 ----懒汉式与饿汉式的区别

    常用的五种单例模式实现方式 ——主要: 1.饿汉式(线程安全,调用率高,但是,不能延迟加载.) 2.懒汉式(线程安全,调用效率不高,可以延时加载.) ——其他: 1.双重检测锁式(由于JVM底层内部模 ...

随机推荐

  1. Tableau Server注册安装及配置详细教程

    Tableau Server注册安装及配置详细教程 本文讲解的是 Tableau Server 10.0 版本的安装及配置 这里分享的 TableauServer 安装版本为64位的10.0版本Ser ...

  2. python-D3-语法入门1

    Python语法注释 什么是注释 注释其实就是对一段代码的解释说明(注释是代码之母) 如何编写注释 方式1:解释说明文字前加警号 (pycharm中有快捷键ctrl+?) # 注释(单行注释) 方式2 ...

  3. 知识图谱-生物信息学-医学顶刊论文(Briefings in Bioinformatics-2021):MPG:一种有效的自我监督框架,用于学习药物分子的全局表示以进行药物发现

    6.(2021.9.14)Briefings-MPG:一种有效的自我监督框架,用于学习药物分子的全局表示以进行药物发现 论文标题:An effective self-supervised framew ...

  4. LcdTools如何导出内置画面为bmp图片

    运行LcdTools,先设置好图片所需分辨率参数,点击"画面设置"栏,修改下图所示参数 点击"画面设置"栏,在"画面资源"栏找到需要导出的画 ...

  5. MFC 学习笔记

    MFC 学习笔记 一.MFC编程基础: 概述: 常用头文件: MFC控制台程序: MFC库程序: 规则库可以被各种程序所调用,扩展库只能被MFC程序调用. MFC窗口程序: 示例: MFC库中类的简介 ...

  6. .NET性能优化-是时候换个序列化协议了

    计算机单机性能一直受到摩尔定律的约束,随着移动互联网的兴趣,单机性能不足的瓶颈越来越明显,制约着整个行业的发展.不过我们虽然不能无止境的纵向扩容系统,但是我们可以分布式.横向的扩容系统,这听起来非常的 ...

  7. 论文翻译:2022_DeepFilterNet2: Towards Real-Time Speech Enhancement On Embedded Devices For Fullband Audio

    博客地址:凌逆战 论文地址:DeepFilternet2: 面向嵌入式设备的全波段音频实时语音增强 论文代码:https://github.com/Rikorose/DeepFilterNet 引用格 ...

  8. 基于实战的Burp Suite插件使用Tips

    基于实战的Burp Suite插件使用技巧 本篇文章首发于奇安信攻防社区 目录 基于实战的Burp Suite插件使用技巧 免责声明: 0×00前言 0×01专业版激活 0×02插件的环境安装 0×0 ...

  9. golang内置包管理工具go mod简明教程

    go mod go buildin package manager. go mod是go语言内置的包管理工具,集成在go tool中,安装好go就可以使用. 要求: go version >= ...

  10. xshell登陆,查看中文日志出现乱码

    看到乱码,首先想到的是编码问题 linux默认编码格式是utf-8,windows默认gbk [root@backup]# echo $LANGen.US.UTF-8 使用fie命令可以查看到文件信息 ...