JAVA设计模式 1 设计模式介绍、单例模式的理解与使用
数据结构我们已经学了一部分了。是该了解了解设计模式了。习惯了CRUD的你,也该了解了解这一门神器、我为啥要说是神器呢?
因为在大厂的面试环节、以及很多的比如
- Springboot
- Mybatis
等开源框架中、大量的使用到了设计模式。为了我们在之后学习源代码的时候不再懵逼,为啥这代码能这样写?为啥巴拉巴拉xxx
设计模式必须要肝完
简介
设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
它是解决特定问题的一系列套路,是前辈们的代码设计经验的总结,具有一定的普遍性,可以反复使用。其目的是为了提高代码的可重用性、代码的可读性和代码的可靠性。
总结下来说就是:一种设计经验、一种设计套路
想一下,被前辈们总结下来的东西。使用这么多年、凝结为精华的东西、该学
创建型
我们首先来了解一下什么是创建型,创建型 作为设计模式的一种分类,是描述如何将一个对象创建出来的。
我们都知道,JAVA 作为一种面向对象编程,最关键的关键字new 用来实例化一个对象。创建型分类、则是描述:如何更好的创建出一个对象
单例模式理解
单例模式,从字面意思上了解就是:它只负责创建出一个对象。因此被称为单例模式。理解一下:我们的计算机都会有一个任务管理器。而在一台windows 的电脑上。任何时候都只会实例化一个任务管理器对象。进而可以理解为单例模式
在一个任务管理器被调用的时候(对象已经被创建),再次使用ctrl+shift+esc 则任然返回这个已经被创建的任务管理器。
UML 图理解
可能我首次提到这个概念,所以简介一下。
UML图是用图形化的方式表示软件类与类之间的关系。用图形化的方式,展示出众多类之间的关联关系。
类图
如下图,我用图形的方式、描述了一个任务管理器类JobManagement.class
它有一个 私有化private的属性management 类型为本身。
它有一个 公开的public 的方法getManagement() 返回类型为本身
- 常用的类型修饰符就是 + 与 -
注意:“可见性”表示该属性对类外的元素是否可见,包括公有(Public)、私有(Private)、受保护(Protected)和朋友(Friendly)4 种,在类图中分别用符号+、-、#、~表示。
http://c.biancheng.net/view/1319.html
关联关系
关联关系就是用来表示:多个类之间存在怎么样的关系的表示方法。常用箭头来表示。
虚线箭头 依赖关系
虚线箭头用来表示依赖关系 从使用类指向被依赖的类。这里使用的类就是我们的main 方法。而被依赖类则是我们的任务管理器对象
菱形箭头 聚合关系
聚合管理作为一种强关联管理。一般用于成员变量的引用。
单例模式的特点
- 对象只会被创建一次,并且重复使用
- 全局提供一个访问点。静态访问点
- 构造方法
私有
学以致用
public class JobManagement {
private static volatile JobManagement management;
private JobManagement() {
}
public static synchronized JobManagement getManagement() {
if (null == management) {
System.out.println("未创建任务管理器,正在创建。。");
management = new JobManagement();
} else {
System.out.println("已经存在创建的任务管理器");
}
return management;
}
}
任务管理器对象包含以及静态类型的自身对象引用。以及将自身的构造方法进行私有化、使得外部无法直接创建对象。而需要这个对象,则需要调用get()方法进行获取。
volatile关键字将属性在所有线程中同步
懒汉模式
if (null == management) {
System.out.println("未创建任务管理器,正在创建。。");
management = new JobManagement();
}
懒汉模式则是在对象首次被访问的时候才进行创建的。否则、若这个对象从未被引用、则对象是不会被创建的。而饿汉模式,刚刚相反。
饿汉模式
private static JobManagement management = new JobManagement();
饿汉模式则是则是在类被虚拟机加载的时候就创建一个示例出来。这样在访问之前就已经有对象被创建、线程也是安全的。
测试使用
public static void main(String[] args) {
JobManagement management1 = JobManagement.getManagement();
System.out.println(management1);
JobManagement management2 = JobManagement.getManagement();
System.out.println(management2);
}
----------------------------
未创建任务管理器,正在创建。。
JobManagement@1b6d3586
已经存在创建的任务管理器
JobManagement@1b6d3586
小结
单例模式在Java 的学习中还是有很多地方会使用到,对于我们学习的第一个,也是最简单的模式,也是最常用的模式。记住它的特点:
- 构造方法私有
- 提供一个全局访问点
参考
http://c.biancheng.net/view/1338.html
欢迎关注

JAVA设计模式 1 设计模式介绍、单例模式的理解与使用的更多相关文章
- Java进阶篇设计模式之一 ----- 单例模式
前言 在刚学编程没多久就听说过设计模式的大名,不过由于当时还是个彻彻底底的菜鸟,并没有去触碰.直到在开始工作中对简单的业务代码较为熟悉之后,才正式的接触设计模式.当时最早接触的设计模式是工厂模式,不过 ...
- 两种语言实现设计模式(C++和Java)(二:单例模式)
本篇介绍单例模式,可以说是使用场景最频繁的设计模式了.可以根据实例的生成时间,分为饿汉模式和懒汉模式 懒汉模式:饿了肯定要饥不择食.所以在单例类定义的时候就进行实例化. 饿汉模式:故名思义,不到万不得 ...
- Java并发程序设计(八)设计模式与并发之单例模式
设计模式与并发之单例模式 简单的单例实现: public class Singleton { private Singleton(){ System.out.println("Creatin ...
- java 28 - 1 设计模式 之 面向对象思想设计原则和模版设计模式概述
在之前的java 23 中,了解过设计模式的单例模式和工厂模式.在这里,介绍下设计模式 面向对象思想设计原则 在实际的开发中,我们要想更深入的了解面向对象思想,就必须熟悉前人总结过的面向对象的思想的设 ...
- Java进阶篇 设计模式之十四 ----- 总结篇
前言 本篇是讲述之前学习设计模式的一个总结篇,其目的是为了对这些设计模式的进行一个提炼总结,能够通过查看看此篇就可以理解一些设计模式的核心思想. 设计模式简介 什么是设计模式 设计模式是一套被反复使用 ...
- JAVA Static方法与单例模式的理解
近期用sonar測评代码质量的时候,发现一个问题,project中一些util类,曾经写的static方法都提示最好用单例的方式进行改正. 为此,我细致想了想,发现还是非常有道理的.这里谈谈我个人对s ...
- 设计模式(一)单例模式:创建模式 ASPNET CORE WEB 应用程序的启动 当项目中 没有STARTUP.CS 类如何设置启动 配置等等
设计模式(一)单例模式:创建模式 先聊一下关于设计的几个原则(1)单一原则(SRP):一个类应该仅有一个引起它变化的原因 :意思就是 (一个类,最好只负责一件事情,并且只有一个引起它变化的原因(2)开 ...
- Java江湖之设计模式
Java江湖之设计模式 ps:最近在学习设计模式,感觉这个是个装逼神器呀,就跟武功一样. 某日,senior同学看见rookie同学在练功. 问,"你练得什么武功?" ...
- 图解Java设计模式之设计模式七大原则
图解Java设计模式之设计模式七大原则 2.1 设计模式的目的 2.2 设计模式七大原则 2.3 单一职责原则 2.3.1 基本介绍 2.3.2 应用实例 2.4 接口隔离原则(Interface S ...
随机推荐
- Rocket - decode - SimplifyDC
https://mp.weixin.qq.com/s/4uWqBRrMVG6FlnBKmw8U-w 介绍SimplifyDC如何简化解码逻辑. 1. 使用 简化从mint和m ...
- ASP.NET中AJAX的异步加载(Demo演示)
此次的Demo是一个页面,页面上有两行字,然后后面用AJAX,使用一个下拉框去替换第一行文字 第一个是被替换的网页 <!DOCTYPE html> <html> <hea ...
- (Java实现) 洛谷 P1115 最大子段和
题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 第一行是一个正整数NN,表示了序列的长度. 第二行包含NN个绝对值不大于1000010000的整数A_iA ...
- Java实现 蓝桥杯算法提高 求最大值
算法提高 求最大值 时间限制:1.0s 内存限制:256.0MB 问题描述 给n个有序整数对ai bi,你需要选择一些整数对 使得所有你选定的数的ai+bi的和最大.并且要求你选定的数对的ai之和非负 ...
- Java实现 LeetCode 553 最优除法(思路问题)
553. 最优除法 给定一组正整数,相邻的整数之间将会进行浮点除法操作.例如, [2,3,4] -> 2 / 3 / 4 . 但是,你可以在任意位置添加任意数目的括号,来改变算数的优先级.你需要 ...
- java实现硬币方案
标题:硬币方案 有50枚硬币,可能包括4种类型:1元,5角,1角,5分. 已知总价值为20元.求各种硬币的数量. 比如:2,34,6,8 就是一种答案. 而 2,33,15,0 是另一个可能的答案,显 ...
- java实现找素数
** 找素数** 素数就是不能再进行等分的整数.比如:7,11.而9不是素数,因为它可以平分为3等份.一般认为最小的素数是2,接着是3,5,- 请问,第100002(十万零二)个素数是多少? 请注意: ...
- Java实现第九届蓝桥杯字母阵列
字母阵列 题目描述 仔细寻找,会发现:在下面的8x8的方阵中,隐藏着字母序列:"LANQIAO". SLANQIAO ZOEXCCGB MOAYWKHI BCCIPLJQ SLAN ...
- 为.netcore助力--WebApiClient正式发布core版本
1 前言 WebApiClient已成熟稳定,发布了WebApiClient.JIT和WebApiClient.AOT两个nuget包,累计近10w次下载.我对它的高可扩展性设计相当满意和自豪,但We ...
- CMAKE工具学习
最近在学习各大物联网平台的SDK包,发现其工程都使用了一种叫cmake的工具在管理代码.于是花了一天时间简单学习了解了cmake工具,其目的是让自己能读懂使用该工具管理的代码,并能简单使用该工具管理我 ...