本文主要讲述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. 【面试题】Vue2动态添加路由 router.addRoute()

    Vue2动态添加路由 点击打开视频讲解更加详细 场景: 一般结合VueX和localstorage一起使用 router.addRoutes vue-router4后 已废弃:使用 router.ad ...

  2. NSIS 检测默认浏览器

    #检测默认浏览器 #编写:水晶石 #原理:用FindExecutable函数查找htm关联程序路径与名称,然后分析字串中包含的可执行文件名. !include "LogicLib.nsh&q ...

  3. 分布式存储系统之Ceph基础

    Ceph基础概述 Ceph是一个对象式存储系统,所谓对象式存储是指它把每一个待管理的数据流(比如一个文件)切分成一到多个固定大小的对象数据,并以其为原子单元完成数据的存取:对象数据的底层存储服务由多个 ...

  4. POJ2282 The Counting Problem(数位DP)

    用dp[pos][val][cnt]表示状态,pos是数位,val是当前统计的数字,cnt是目前统计的目标数字的出现次数 注意状态的转移过程,统计数字0时前导0的影响. 1 #include<c ...

  5. 谣言检测(DUCK)《DUCK: Rumour Detection on Social Media by Modelling User and Comment Propagation Networks》

    论文信息 论文标题:DUCK: Rumour Detection on Social Media by Modelling User and Comment Propagation Networks论 ...

  6. 洛谷 P5607 [Ynoi2013] 无力回天 NOI2017

    人生第一道Ynoi,开心 Description https://www.luogu.com.cn/problem/P5607 Solution 拿到这个题,看了一下,发现询问要求最大异或和,怎么办? ...

  7. IDEA对数据库、表、记录的(增删改查可视化操作)、数据库安全性问题的演示

    对数据库的增删改查 新增数据库 修改数据库 删除数据库 对表的增删改查 新增表 修改表 删除表 对记录的增删改查 数据库安全性问题的演示 演示脏读 ​ 一个事物里面读到了另外一个事物没有提交的数据: ...

  8. 【算法】浅学 LCA

    参考资料 浅析最近公共祖先(LCA) 最近公共祖先 - OI Wiki [白话系列]倍增算法 一.概念 最近公共祖先称为 LCA (Lowest Common Ancestor) 它指的是在一颗树中, ...

  9. [C#]SourceGenerator实战: 对任意对象使用await吧!!!

    [C#]SourceGenerator实战: 对任意对象使用await吧!!! 前言 本文记录一次简单的 SourceGenerator 实战,最终实现可以在代码中 await 任意类型对象,仅供娱乐 ...

  10. Linux基础_6_文本编辑

    vi i #编辑 ESC+:wq #保存退出 ESC+ZZ #保存退出 ESC+:q! #不保存退出 shift+z+q #不保存退出 dd #删除所在行 ESC+u #撤销dd误操作 :/字符串 # ...