前言:
  学习面向对象程序设计的朋友应该知道,我们大多数情况下通过 new 操作来实例化对象的。对于一些仅需要一次初始化的对象来说,频繁的new操作无疑会过多浪费内存空间。基于此,单例模式便应运而生了。所谓单例,即"一次初始化,多次操作"。那么本文就介绍一下自己封装一个支持单例的类的主要步骤。

实现单例的3个要点:

·静态化实例;
·将构造方法封装为private;
·对外提供一个公开的getInstance()方法。

代码实现:

package com.modelDesign.instance;public class Person {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}private Person(){}private static Person pp=new Person();public static Person getInstance(){return pp;}}

客户端测试程序:

package com.modelDesign.instance;public class TestPerson {public static void main(String[] args) {Person p1 = Person.getInstance();p1.setName("Jack");Person p2 = Person.getInstance();System.out.println("是否单例:"+(p1==p2));System.out.println(p2.getName());}
}

测试结果:

补充:

  当你设计的应用涉及到多线程时,上面的代码还是有瑕疵的。由于线程与线程之间的冲突,很可能会造成多次初始化。由此,我们引入多线程的锁——Lock加以解决。
适应多线程的单例实现:

package com.modelDesign.instance;import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class InstanceSuper {private static InstanceSuper instance;private static Lock lock=new ReentrantLock();private InstanceSuper() {}public static InstanceSuper getInstance(){if(instance==null){lock.lock();if(instance==null){instance = new InstanceSuper();}lock.unlock();}return instance;}}

注意:测试类不要包含在单例类中,因为同一个类中私有的构造方法同样可以被其他方法调用,也就是说在main()函数进行new操作时不会报错!!

转载于:https://www.cnblogs.com/SeaSky0606/p/4719087.html

单例模式:Instance相关推荐

  1. 单例模式instance

    单例模式是设计模式中最简单的模式了,它的目的是为了保证一个流程中只有一个对象存在,相当于一个全局变量. 1 单例模式的实现 创建一个类,调用者不能通过默认构造方法的方式创建实例,而是提供一个接口用来返 ...

  2. C++:单例模式 instance()

    本文转载自:https://blog.csdn.net/Hackbuteer1/article/details/7460019 1.什么是单例模式? 在设计或开发中,肯定会有这么一种情况,一个类只能有 ...

  3. GOF23设计模式(创建型模式)单例模式

    目录: 一:单例模式的核心作用.常见应用场景 二:五种单例模式及其实现 三:关于反射和反序列化破解单例模式的漏洞,以及相应的解决方案 四:测试五种单例模式的效率 一:核心作用及常见应用场景: 核心作用 ...

  4. java枚举类及面试题为什么枚举实现单例模式是安全的?

    目录 枚举类 为什么会有枚举类? 枚举类的使用 枚举类的常用方法 枚举的构造 枚举类型能被反射吗? 为什么枚举实现单例模式是安全的? 枚举类的优缺点 枚举类 为什么会有枚举类? 假如说程序中有一些颜色 ...

  5. php中new意思,php 在一个类中new自己代表什么意思 ?是构造函数

    一个类在他类方法new了本身 代表什么? 是构造函数?? 回复讨论(解决方案) new 类名 用于创建一个这个类的实例,这在哪里都一样,并没有使用上的差异 你的 DB 类声明了私有的构造函数,所以这个 ...

  6. php框架中数据库模型层原理,简单模拟ThinkPHP框架模型层对数据库的链式操作-Go语言中文社区...

    在接口被实例化以后的每个方法中return 类本身就可以达到链式操作. 改善了写多行代码执行一次操作的缺点. 下面请看我的代码,若有疑问,请留言给我. class Instance{ public s ...

  7. 设计模式-创建者模式篇

    设计模式 目录: 一.单例模式 二.工厂模式 三.抽象工厂模式 四.原型模式 五.建造者模式 注:学习视频:黑马程序员Java设计模式 创建者模式 创建型模式的主要关注点是"怎样创建对象?& ...

  8. Qt学习笔记:自定义窗体的移动+控件图标

    在这里首先感谢刘大师的作品:Qt编写通用主界面导航(开源) 贴上演示: 本博客主要是研究了刘大师的作品然后自己总结,做点笔记..不喜勿喷~~~ 废话不多说,先贴出代码解析一下: AppInit::In ...

  9. 2018年上海后半年JAVA软件工程师面试真题

    查询超过该部门员工大于3个的部门 SELECT deptid FROM table1 GROUP BY deptid HAVING COUNT(deptid) > 3 如果员工名称重复的部门id ...

  10. apollo 7.0——单例设计模式解析

    文章目录 单例模式 饿汉模式 懒汉模式 线程不安全 单检锁 双检锁 Meyers 单例 apollo中单例模式 Instance 方法 CleanUp 方法 单例模式 三个要点: 提供对唯一实例的全局 ...

最新文章

  1. 3 用python进行OpenCV实战之画图(直线,矩形,圆形)
  2. php读取cookie文件,PHP读取CURL模拟登录时生成Cookie文件的方法,_PHP教程
  3. 基于深度学习的端到端人脸识别技术:全面调研
  4. wdpc搭建https网站
  5. python image convert_从python运行imagemagick convert(控制台应用程序)
  6. InfoQ —— 腾讯游戏大数据服务场景与应用
  7. 小米刷第三方recovery_小米平板4/Plus LTE版本开启电话功能
  8. ubuntu Django项目后台不挂断运行之screen命令
  9. java支持闭包_JAVA 需要引入闭包吗
  10. UINavigationBar颜色设置 用色码设置有误差
  11. 英语计算机考研复试专业翻译题库,计算机专业英语题题库.doc
  12. 宋朝人物第一,朱熹都说他是“天地间第一流人物”
  13. AD7705-模数转换器-工作原理介绍
  14. win7c盘空间越来越小_C盘空间越来越小怎么办,5个步骤无损扩容1招就搞定
  15. 四大列表控件之RadioButtonList控件(单选按钮)
  16. UEBA——通过用户画像识别安全威胁
  17. 完美解决api-ms-win-crt-runtime-l1-1-0.dll详细步骤
  18. BZOJ5473: 仙人掌
  19. 计算机软件里的字体,软件里面的字体大小
  20. 中关村被骗记(维权全过程)

热门文章

  1. ssm整合2 增删改
  2. HashMap的7种遍历方式
  3. 关于用notepad++确认代码中\r\n\t空格等不显示的字符及替换
  4. GCC 7.3.0编译安装
  5. React学习:ref调用、组件封装调用-学习笔记
  6. 思维模型篇:数据分析必知必会的两个原则
  7. JSON学习笔记(六)- JSONP
  8. 10种轻量级人脸检测算法大PK
  9. 特征工程完全手册 - 从预处理、构造、选择、降维、不平衡处理
  10. 性能监控/优化系列——JVM监控/调优