单例模式的定义和面试重点,没事多动手对自己是没有什么坏处的
单例模式
这里我使用在how2j上部分解答加上自己写的一些代码,我会加上我自己的理解给大家最简单的解答。
这里的代码环境设定在LOL中。
其有一个怪叫大龙GiantDragon,只有一只,所以该类,只能被实例化一次。
我们用这个来做代码的示范。
单例模式定义
单例模式又叫做 Singleton模式,指的是一个类,在一个JVM里,只有一个实例存在。
最终造成影响很简单,就是
外部无法通过new 得到新的实例。
我们实现的方法是通过
私有化构造方法
实现的。
构造方法晓得不?这个不知道我们可以百度或者再写一篇给你介绍介绍。
单例模式核心三要素(面试重点)
- 私有化构造方法
- 定义私有静态 (类)属性指向实例
- public static(公共静态(或者类))的 (getInstance)方法,返回第二步的静态属性
如果不理解,我们可以通过代码进一步深入理解
饿汉单例模式
GiantDragon 提供了一个public static的getInstance方法,外部调用者通过该方法获取定义的对象,而且每一次都是获取同一个对象。 从而达到单例的目的。
这种单例模式又叫做饿汉式单例模式,无论如何都会创建一个实例
package charactor; public class GiantDragon { //*1 私有化构造方法 private GiantDragon() { } //*2 准备一个类属性,指向一个实例化对象 private static GiantDragon instance = new GiantDragon(); //*3 公共静态方法 提供调用者获取内部实例的对象 public static GiantDragon getInstance() { return instance; } }
懒汉单例模式
懒汉式单例模式与饿汉式单例模式不同,只有在调用getInstance的时候,才会创建实例。
package charactor; public class GiantDragon { //**1 私有化构造方法 private GiantDragon() { } //**2 定义一个类属性,用于指向一个实例化对象,暂时指向null private static GiantDragon instance; //**3 公共静态(类)方法,用于返回实例对象 public static GiantDragon getInstance() { //第一次访问,发现instance没有指向任何对象,此时进行初始化 if (null == instance) { instance = new GiantDragon(); } //返回instance指向的对象 return instance; } }
饿汉和懒汉单例模式的调用方式
调用的方式都是相同的,并且生成的都是的单一对象。
package charactor; public class TestGiantDragon { public static void main(String[] args) { //GiantGragon g = new GiantGragon();//不能直接用new创建对象 //只能通过getInstance得到一个对象 GiantDragon g1 = GiantDragon.getInstance(); GiantDragon g2 = GiantDragon.getInstance(); GiantDragon g3 = GiantDragon.getInstance(); //都是同一个对象 System.out.println(g1 == g2);//true System.out.println(g1 == g3);//true System.out.println(g2 == g3);//true } }
饿汉单例模式和懒汉单例模式的区别
饿汉式,是立即加载的方式,无论是否会用到这个对象,都会加载。
如果在构造方法里写了性能消耗较大,占时较久的代码,比如建立与数据库的连接,那么就会在启动的时候感觉稍微有些卡顿。
懒汉式,是延迟加载的方式,只有使用的时候才会加载。 并且有线程安全的考量。
使用懒汉式,在启动的时候,会感觉到比饿汉式略快,因为并没有做对象的实例化。 但是在第一次调用的时候,会进行实例化操作,感觉上就略慢。
看业务需求,如果业务上允许有比较充分的启动和初始化时间,就使用饿汉式,否则就使用懒汉式。
单例模式小练手
题目:
使用饿汉式单例模式, 把Hero类改造成为单例模式
使用懒汉式单例模式,把Item类改造成为单例模式
这里我们就不给Hero和Item里增加其他多余属性了。
老规矩,我们先自己写然后再对照答案。
这个是饿汉单例模式
package charactor; public class SingleHero { //不用写主函数 //饿汉汉单例模式 //1. 构造方法私有化,无返回值 private SingleHero() { } //2. 定义一个静态(类)属性指向实例,同时新建一个实例 private static SingleHero instance = new SingleHero(); //3. 定义一个公开静态(类)方法让外部可以调用,返回类型是类类型 public static SingleHero getInstance() { return instance; } //4.使用方法是(不在本类里使用) //SingleHero s = SingleHero.getInstance(); }
这个是懒汉单例模式
package charactor; public class SingleItem { //不用写主函数 //懒汉单例模式 //1. 私有化构造函数,无返回值 private SingleItem() { } //2. 私有类属性指向实例对象,懒汉此时懒得不创建实例 private static SingleItem instance; //3. 公共类 (静态)方法用来给外部调用创建实例,返回是类属性 public static SingleItem getInstance() { //首次判断instance不存在则创建 if (null == instance) { instance = new SingleItem(); } //返回实例 return instance; } //4.使用这个来创建实例,在其他class的main里 //SingleItem s = SingleItem.getInstance(); }
- 关于eclipse的debug模式,没有从自己定义的断点开始,而从一些java类开始的
- 如果你发现了自己的学习模式,愿意学并且能坚持,我觉得没什么能阻挡你征服软件世界的脚步(对于开发人员来讲,最大的风险是:在职业规划上没有延续性地乱跳槽。时刻要牢记在心的:培养自己的稀缺性),安晓辉大神的感悟 good
- perl 变量 $/ 的用法解析 上下文为行模式时,$/ 定义以什么来区分行
- 做事的人总是要挨骂的,挨骂是一件好事。如果一个人不挨骂,肯定因为他没有做事。一个职业经理人,是否因为挨了几次骂就破罐破摔,随波逐流?一个职业经理人,你的责任是把自己的工作做好,作为市场总监,我的责任是告诉公司,明年我的品牌规划、产品规划、宣传形式是什么,这是责任。
- 自己定义的Java类中log语句在控制台没有输出问题解决
- 自己动手打造ajax图片上传(网上没有的)
- 设计模式(二):自己动手使用“观察者模式”实现通知机制
- 【原创】自己动手实现牛逼的单例模式
- 面试复习重点——基础篇:操作系统、计算机网络、设计模式【山科大牛陈磊整理】
- 面试复习重点——基础篇:操作系统、计算机网络、设计模式【山科大牛陈磊整理】
- 如果数据库处于归档模式但自动归档功能没有开启会产生什么后果呢,产生这种情况后又怎样解决呢?
- 面试笔试重点总结:操作系统、计算机网络、设计模式
- 微信开发模式之自己定义菜单实现
- 让自己慢下来(6)- 是什么。。。?我没有答案。。
- [面试] - jdk 中的设计模式(加入自己的理解)
- 构造函数和析构函数的作用是什么?什么时候需要自己定义构造函数和析构函数?
- 自己动手应用Groovy实现Gradle的DSL(一) Task定义
- 自己动手丰衣足食,h5手机端jquery弹窗插件(事件冒泡、单例模式、遮盖部分禁止默认滚动)
- 在网上找了个java小游戏的实例,敲完后发现没有main,自己加了个后,无法运行请问是什么问题 [ Java SE]
- 如何判断自己的机器是使用什么存储模式