本文主要讲述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. hive数据导出到linux本地

    方法1(hive下执行):insert overwrite local directory 'Linux本地目录' row format delimited fields terminated by  ...

  2. POJ1651 Multiplication Puzzle (区间DP)

    这道题的妙处在于把原问题看成矩阵连乘问题,求这些矩阵相乘的最小乘法次数,比如一个i*k矩阵乘一个k*j的矩阵,他们的乘法次数就是i*k*j (联想矩阵乘法的三层循环),题目说的取走一张牌,类似于矩阵相 ...

  3. 数据结构之单链表(基于Java实现)

    链表:在计算机中用一组任意的存储单元存储线性表的数据元素称为链式存储结构,这组存储结构可以是连续的,也可以是不连续的,因此在存储数据元素时可以动态分配内存. 注:在java中没有指针的概念,可以理解为 ...

  4. 构建Springboot项目、实现简单的输出功能、将项目打包成可以执行的JAR包(详细图解过程)

    1.构建SpringBoot项目 大致流程 1.新建工程 2.选择环境配置.jdk版本 3.选择 依赖(可省略.后续要手动在pom文件写) 4.项目名 1.1 图解建立过程 1.2 项目结构 友情提示 ...

  5. Vue学习之--------列表排序(ffilter、sort、indexOf方法的使用)、Vue检测数据变化的原理(2022/7/15)

    文章目录 1.列表排序 1.1 .代码实例 1.2 .测试效果 1.3.需要掌握的前提知识 2.Vue监测数据变化的原理 2.1.代码实例 2.2 .测试效果 3.Vue检测数据的原理 3.1 基本知 ...

  6. python创建icon图标

    def extension_replace(path,extension): for i in range(1,len(path)): if (path[-i] == '.'): new_path = ...

  7. spring-ioc知识点

    1.bean管理 -spring创建对象 -在spring的配置文件中,使用bean标签.标签里添加对应的属性.就可以实现对象的创建 -在bean标签中有很多属性 -id属性:唯一的标识 -class ...

  8. TensorFlow?PyTorch?Paddle?AI工具库生态之争:ONNX将一统天下

    作者:韩信子@ShowMeAI 深度学习实战系列:https://www.showmeai.tech/tutorials/42 本文地址:https://www.showmeai.tech/artic ...

  9. 将Oracle数据库迁移到达梦数据库

    公司某产品在项目现场上常用到的数据库有Oracle和达梦. 做性能测试需要根据项目现场预埋大量的基础数据和业务数据,耗费时间.精力.故完成Oracle数据库的性能测试之后,采用直接将Oracle数据库 ...

  10. 元数据性能大比拼:HDFS vs S3 vs JuiceFS

    元数据是存储系统的核心大脑,元数据性能对整个大数据平台的性能和扩展能力至关重要.尤其在处理海量文件的时候.在平台任务创建.运行和结束提交阶段,会存在大量的元数据 create,open,rename ...