本文主要讲述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. Java泛型的总结

    泛型可以用于接口.类.方法上.还有泛型通配符这个概念 泛型的好处:可以在编译时检查 1.用于方法中,指定该方法中的形参的类型. 语法:修饰符 <代表泛型的变量> 返回值类型 方法名(参数) ...

  2. PAT (Basic Level) Practice 1018 锤子剪刀布 分数 20

    大家应该都会玩"锤子剪刀布"的游戏:两人同时给出手势,胜负规则如图所示: 现给出两人的交锋记录,请统计双方的胜.平.负次数,并且给出双方分别出什么手势的胜算最大. 输入格式: 输入 ...

  3. 分布式存储系统之Ceph集群部署

    前文我们了解了Ceph的基础架构和相关组件的介绍,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16720234.html:今天我们来部署一个ceph集群: 部 ...

  4. PHP全栈开发(八):CSS Ⅰ 选择器

    直到目前为止,我们把从HTML中的数据是如何通过PHP到服务器端,然后又通过PHP到数据库,然后从数据库中出来,通过PHP到HTML的整个过程通过一个案例过了一遍. 可以说,这些才刚刚开始.下面我们开 ...

  5. 【nginx】使用 nginx 时,使用 sub_filter 注入 js 代码,例如 google analysis 等

    目录 1. 创建 GA 1 2. 注入代码2 结果 网站 F12 GA 控制台 Reference 在一项工作中,已经将内网的一个网站通过 二级域名 + nginx + frp 的方式映射到公网.网站 ...

  6. 我的Vue之旅 06 超详细、仿 itch.io 主页设计(Mobile)

    第二期 · 使用 Vue 3.1 + TypeScript + Router + Tailwind.css 仿 itch.io 平台主页. 我的主题 HapiGames 是仿 itch.io 的 in ...

  7. 驱动开发:内核枚举ShadowSSDT基址

    在笔者上一篇文章<驱动开发:Win10枚举完整SSDT地址表>实现了针对SSDT表的枚举功能,本章继续实现对SSSDT表的枚举,ShadowSSDT中文名影子系统服务描述表,SSSDT其主 ...

  8. 通过URL保存文件

    1 <?php 2 3 function dlfile($file_url, $save_to) 4 { 5 $content = file_get_contents($file_url); 6 ...

  9. HTML躬行记(2)——WebRTC基础实践

    WebRTC (Web Real-Time Communications) 是一项实时通讯技术,在 2011 年由 Google 提出,经过 10 年的发展,W3C 于 2021 年正式发布 WebR ...

  10. 禁忌搜索算法TSA 旅行商问题TSP python

    import math import random import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot ...