创建型模式之单例设计模式(java版)
2016-07-27 22:47
281 查看
单例设计模式目得:
主要就是为了使一个类只能存在一个实例化的对象。
单例设计模式特点:
如果想要使这个对象唯一,就不能随便让其他类还建立这个对象。但是还得让其他的类可以使用这个对象(就是只能使用,不能创造),所以其他类要想访问,只能通过专门提供的接口。
单例设计模式java代码思想:
1.构造函数私有化:由于不能被其他类建立对象,所以只能使他们的访问权限设置为private,也就是不能创造对象。
2.在本类中创建一个私有并静态的本类对象:由于这个本类对象不能被外部访问,所以要设置为私有访问权限,由于外部类不能创建对象访问本类中的方法(也就是提供给外部的接口),所以只能通过类名调用,所以对外访问的方法肯定是静态的,所以静态方法访问的全局的对象也得是静态的(解释:如果是非静态的变量,需要通过对象去调用。而静态方法在未创建对象时直接用类就已经调用了,上哪去找非静态的变量呢?)。
3.对外提供一个公有静态的方法用于获取静态的全局对象:就是给外部提供一个可以访问对象的接口,所以是公有的,只能使用类调用,所以是静态的。
对于老鸟,可能上面的话又臭又长吧。
下面直接是代码图
第一张图就是饿汉式,就是先在内存中初始化一个Single对象,可能就是所谓的饿完了,先来个对象吧,哈哈。
第二张图就是懒汉式,我还以为叫饱汉式呢,(开始想的是先不吃,等饿了再吃),实际就是等方法被调用的时候再创建对象。
反正面试的时候问我单例模式:我当时就直接说,一个先new对象,一个是需要的时候在new对象。
细看之下,会发现懒汉式是线程不安全的一种模式,如果两个线程同时去访问,并且一个已经new对象了,另一个虽然没有实例化对象,那么当到if(single==null)的判断,一个线程是没有实例化对象,那么已经new对象的另一个线程,就也会跟着进到判断体中,也会new对象,那么就不能保证是单例了。所以懒汉式是线程不安全的。
主要就是为了使一个类只能存在一个实例化的对象。
单例设计模式特点:
如果想要使这个对象唯一,就不能随便让其他类还建立这个对象。但是还得让其他的类可以使用这个对象(就是只能使用,不能创造),所以其他类要想访问,只能通过专门提供的接口。
单例设计模式java代码思想:
1.构造函数私有化:由于不能被其他类建立对象,所以只能使他们的访问权限设置为private,也就是不能创造对象。
2.在本类中创建一个私有并静态的本类对象:由于这个本类对象不能被外部访问,所以要设置为私有访问权限,由于外部类不能创建对象访问本类中的方法(也就是提供给外部的接口),所以只能通过类名调用,所以对外访问的方法肯定是静态的,所以静态方法访问的全局的对象也得是静态的(解释:如果是非静态的变量,需要通过对象去调用。而静态方法在未创建对象时直接用类就已经调用了,上哪去找非静态的变量呢?)。
3.对外提供一个公有静态的方法用于获取静态的全局对象:就是给外部提供一个可以访问对象的接口,所以是公有的,只能使用类调用,所以是静态的。
对于老鸟,可能上面的话又臭又长吧。
下面直接是代码图
public class SingleInstance { private static SingleInstance single=new SingleInstance(); private SingleInstance(){} public static SingleInstance getSingleInstance(){ return single; } }
第一张图就是饿汉式,就是先在内存中初始化一个Single对象,可能就是所谓的饿完了,先来个对象吧,哈哈。
public class SingleInstance { private static SingleInstance single=null; private SingleInstance(){} public static SingleInstance getSingleInstance(){ if(single==null) single=new SingleInstance(); return single; } }
第二张图就是懒汉式,我还以为叫饱汉式呢,(开始想的是先不吃,等饿了再吃),实际就是等方法被调用的时候再创建对象。
反正面试的时候问我单例模式:我当时就直接说,一个先new对象,一个是需要的时候在new对象。
细看之下,会发现懒汉式是线程不安全的一种模式,如果两个线程同时去访问,并且一个已经new对象了,另一个虽然没有实例化对象,那么当到if(single==null)的判断,一个线程是没有实例化对象,那么已经new对象的另一个线程,就也会跟着进到判断体中,也会new对象,那么就不能保证是单例了。所以懒汉式是线程不安全的。
相关文章推荐
- 148. Sort List
- Spring Boot 学习之旅
- Java语言中的访问权限修饰符
- Java线程的同步与死锁
- 解决javaweb乱码问题
- JAVA编码规范笔记
- struts2出现Could not find action or result的错误原因
- [置顶]Java中 实现多线程成的三种方式(继承,实现,匿名内部类)
- java 实现(代码) -- 水仙花数 + 杨辉三角形
- Java Collections与Arrays的浅解
- Java 聊天室
- java this 关键字练习
- Java-基础-多线程notify()和notifyAll()
- Java面向对象二
- Retrofit2使用CallAdapterFactory的错误处理
- Java中的基本数据类型
- RxJava 之 Hello World
- java基础--06对象内存图
- Struts2小结
- JAVA解析JSON数据转化为Map对象