菜鸡的Java笔记 第二十九 - java 单例设计模式
SingleCase 单例设计模式
1.单例设计模式的特点
2.多例设计模式的特点
内容
单例设计模式
现在如果说有这么一个程序类
class Singleton{
private SingleCase(){} // 构造方法私有
public void print(){
System.out.println("***************");
}
}
// 这个时候程序类给出肯动是直接实例化对象,而后调用方法
public class SingleCase{
public static void main(String args[]){
Singleton inst = null;// 声明对象
inst = new SingleCase(); // 实例化对象
inst.print();
}
}
在此时的 Singleton 类中一定存在有无参的构造方法,因为自动成的。
但是构造方法虽然一般都会使用 public 声明,可是也可以使用 private 声明
当构造方法使用 private 声明之后 程序执行就会出错
因为此时构造方法被私有化了,所以我无法从外部进行构造方法的调用
那么现在在保证构造方法与 print() 方法都不做任何修改的前提下,要求通过一些适当的 Singleton 变化让类外部可以得到 Singleton 类的实例化对象,并且调用 print() 方法
于是有了以下的分析:
分析一:现在程序的关键是在于构造方法上使用了 private (private SingleCase(){} // 构造方法私有了),那么对于 private 的特点是只能够在本类中进行访问
那么现在换一个思路:能不能说在本类准备好一个实例化对象呢?
class Singleton{
Singleton instance = new Singleton
private SingleCase(){} // 构造方法私有
public void print(){
System.out.println("***************");
}
}
// 这个时候程序类给出肯动是直接实例化对象,而后调用方法
public class SingleCase{
public static void main(String args[]){
Singleton inst = null;// 声明对象
}
}
分析二:此时内部声明的 instance 属性属于一个普通属性,那么普通属性有一个前提:在实例化对象后才可以调用,但是现在外部无法实例化对象
那么就考虑使用 static ,因为 static 不受到实例化对象的控制
class Singleton{
static Singleton instance = new Singleton
private SingleCase(){} // 构造方法私有
public void print(){
System.out.println("***************");
}
}
// 这个时候程序类给出肯动是直接实例化对象,而后调用方法
public class SingleCase{
public static void main(String args[]){
Singleton inst = null;// 声明对象
inst = Singleton.instance;
inst.print();
}
}
分析三:强调过只要是类中的属性都是应该进行 private 封装,所以以上代码中 instance 属性也应该进行封装
那么一旦封装了,就必须通过方法访问,按照此时要访问的是 static 属性,并且类无法直接在外部产生实例化对象,那么就编写一个 static 方法
class Singleton{
private static Singleton instance = new Singleton();
private SingleCase(){} // 构造方法私有
public static Singleton getlnstance(){
return instance;
}
public void print(){
System.out.println("***************");
}
}
// 这个时候程序类给出肯动是直接实例化对象,而后调用方法
public class SingleCase{
public static void main(String args[]){
Singleton inst = null;// 声明对象
inst = Singleton.getlnstance();
inst.print();
}
}
分析四:这么写代码折腾一圈最终目的还是在外部使用实例化对象调用方法,那么这种脱裤子放屁的意义在哪里?
所以这个时候通过内存关系可以发现,不管外部有多少个对象的声明,最终所能产生的实例化对象只有一个
也就是说本程序限制了实例化对象的产生,只维持了一个
之所以将构造方法私有就是切断了那么自然无法产生新的实例化对象
分析五:缺陷
为了保证整个代码在操作的过程之中只会存在有唯一的一个实例化对象,并且不可更改,则可以利用 final 声明
面试题: 请编写一个 Singleton 程序,并说明程序的主要特点
class Singleton{
private static final Singleton INSTNCE = new Singleton();
private SingleCase(){} // 构造方法私有
public static Singleton getlnstance(){
// instance = new Singleton(); 这种代码的可能性还是有得 为了不让其出现 加上 final
return INSTNCE;
}
public void print(){
System.out.println("***************");
}
}
// 这个时候程序类给出肯动是直接实例化对象,而后调用方法
public class SingleCase{
public static void main(String args[]){
Singleton inst = null;// 声明对象
inst = Singleton.getlnstance();
inst.print();
}
}
构造方法私有化,外部无法产生新的实例化对象,只能够通过类提供的 static 方法取得唯一的一个对象的引用
对于单例设计模式有两类:饿汉式(以上的代码),懒汉式
饿汉式:不管程序中是否有对象需要使用此类,那么此类的对象都实例化好;
懒汉式:在第一次使用的时候才进行实例化
范例:观察懒汉式
class Singleton{
private static Singleton instance;
private SingleCase(){} // 构造方法私有了
public static Singleton getlnstance(){
if(instance == null){
instance = new Singleton(); // 需要的时候进行实例化
}
return instance;
}
public void print(){
System.out.println("***************");
}
}
// 这个时候程序类给出肯动是直接实例化对象,而后调用方法
public class SingleCase{
public static void main(String args[]){
Singleton inst = null;// 声明对象
inst = Singleton.getlnstance();
inst.print();
}
}
这两个分类只是一个小小的概念,关键 还是将之前的单例设计模式编写熟练
多例设计模式
不管是单例设计还是多例设计,本质就一个:构造方法私有化,内部产生实例化对象,只不过单例设计只产生一个,多例设计不产生多个
例如:现在要求描述一周时间数的类,只能够有七个对象
例如:要求描述性别的类,只能有两个
范例:性别的描述
class Sex{
public static final int MALE_CH = 1;
public static final int FEMALE_CH = 1;
private static final Sex MALE = NEW Sex("男");
private static final Sex FEMALE = NEW Sex("女");
private String title;
private Sex(String title){
this.title;
}
public static Sex getlnstance(int ch){
switch(ch){
case MALE_CH:
return MALE;
case FEMALE_CH:
return FEMALE;
dafault:
return null;
}
}
public String toString(){
return this.title;
}
}
public class SingleCase{
public static void main(String args[]){
Sex sex = Sex.getlnstance(Sex.MALE_CH);
System.out.println(sex);
}
}
多例只是单例的一种衍生品,本质上没有区别
总结
1.对于单例设计模式,多例设计模式更希望理解它设计的出发点:限制对象产生
2.程序的基本结构必须要记下
菜鸡的Java笔记 第二十九 - java 单例设计模式的更多相关文章
- java笔记之静态修饰附和单例设计模式
第六天笔记 静态修饰符static: 一.static修饰成员变量: static用来修饰成员变量叫静态成员变量,没有static修饰的成员变量叫非静态成员变量 静态成员的访问方式: (1) 用 ...
- 菜鸡的Java笔记 第二十八 - java 包的定义
包的主要作用以及定义 包的导入操作 系统常见的开发包 jar 程序命令 包的定义 在任何的操作系统之中都有一个统一的共识:同一个目录下不能够存在有相同的文 ...
- 菜鸡的Java笔记 第十九 - java 继承
继承性的主要目的,继承的实现,继承的限制 继承是面向对象中的第二大主要特点,其核心的本质在于:可以将父类的功能一直沿用下去 为什么需要继承? ...
- 菜鸡的Java笔记 第二十六 - java 内部类
/* innerClass 从实际的开发来看,真正写到内部类的时候是在很久以后了,短期内如果是自己编写代码,几乎是见不到内部类出现的 讲解它的目的第一个是为了解释概念 ...
- 菜鸡的Java笔记 第二十四 - java 接口的基本定义
1.接口的基本定义以及使用形式 2.与接口有关的设计模式的初步认识 3.接口与抽象类的区别 接口与抽象类相比,接口的使用几率是最高的,所有的 ...
- 菜鸡的Java笔记 第二十二 - java 对象多态性
本次只是围绕着多态性的概念来进行讲解,但是所讲解的代码与实际的开发几乎没有关系,而且多态一定是在继承性的基础上才可以操作的, 而本次将使用类继承的关系来描述多态的性质,实际的开发中不会出 ...
- “全栈2019”Java多线程第二十九章:可重入锁与不可重入锁详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- Java进阶(三十九)Java集合类的排序,查找,替换操作
Java进阶(三十九)Java集合类的排序,查找,替换操作 前言 在Java方向校招过程中,经常会遇到将输入转换为数组的情况,而我们通常使用ArrayList来表示动态数组.获取到ArrayList对 ...
- JAVA之旅(六)——单例设计模式,继承extends,聚集关系,子父类变量关系,super,覆盖
JAVA之旅(六)--单例设计模式,继承extends,聚集关系,子父类变量关系,super,覆盖 java也越来越深入了,大家加油吧!咱们一步步来 一.单例设计模式 什么是设计模式? JAVA当中有 ...
随机推荐
- 【死磕NIO】— 阻塞IO,非阻塞IO,IO复用,信号驱动IO,异步IO,这你真的分的清楚吗?
通过上篇文章([死磕NIO]- 阻塞.非阻塞.同步.异步,傻傻分不清楚),我想你应该能够区分了什么是阻塞.非阻塞.异步.非异步了,这篇文章我们来彻底弄清楚什么是阻塞IO,非阻塞IO,IO复用,信号驱动 ...
- 拥抱开源,共建生态 - 开源生态与效能提升专场 | CIF 精彩看点
随着软件技术日新月异的发展,GitHub 已经进化成为人类软件的基因库,遇到问题第一时间在 GitHub 上寻求合适的解决方案,已经逐渐变成工程师处理问题的常见方法.据 GitHub 年度报告显示,2 ...
- Spring Bean装配笔记
Spring Bean装配笔记 Spring中的Bean是一个很重要的概念.Spring作为一个Bean容器,它可以管理对象和对象之间的依赖关系,我们不需要自己建立对象,把这部分工作全部转交给容器完成 ...
- 无法解析的外部符号之_cvLoadImage,_cvCreateMat,_cvReleaseImage之类
一个错误可能是:附加依赖项少添加了库函数: 还有一个可能是:配置设置错误了,比如该是64位,却设置成win32了.改过来就好了. 要注意opencv的使用中 在Debug.Release模式以及x64 ...
- 小白自制Linux开发板 番外篇 一 modprobe加载驱动问题(转载整理)
使用modprobe加载驱动 转载地址:https://blog.csdn.net/qq_39101111/article/details/78773362 前面我们提到,modprobe并不需要指定 ...
- 初探webpack之从零搭建Vue开发环境
初探webpack之搭建Vue开发环境 平时我们可以用vue-cli很方便地搭建Vue的开发环境,vue-cli确实是个好东西,让我们不需要关心webpack等一些繁杂的配置,然后直接开始写业务代码, ...
- Android QMUI实战:沉浸式/适配状态栏
近期研究QMUI换肤的实现,顺便分析了下QMUI的沉浸式. 网上已有很多关于QMUI实现页面沉浸式的文章,简而言之:复杂了. 本期,我们仅通过几行代码,即可完美实现页面沉浸式效果,并轻松匹配换肤的色彩 ...
- Markdown数学公式
1. 显示位置与大小 正文(inline)中的LaTeX公式用$...$定义, 显示在当前行内. $\sum_{i=0}^N\int_{a}^{b}g(t,i)\text{d}t$ \(\sum_{i ...
- PAT (Basic Level) Practice (中文)1009 说反话 (20分)
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出. 输入格式: 测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串.字符串由若干单词和若干空格组成,其中单词是由英文字母(大小 ...
- 保护模式篇——PAE分页
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...