200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > java单例设计模式双重_Java 设计模式 ——单例模式(饿汉 懒汉 双重锁 静态内部类)...

java单例设计模式双重_Java 设计模式 ——单例模式(饿汉 懒汉 双重锁 静态内部类)...

时间:2018-12-15 18:26:51

相关推荐

java单例设计模式双重_Java 设计模式 ——单例模式(饿汉 懒汉 双重锁 静态内部类)...

设计模式:

是在大量的实践中总结和理论化之后优选的代码结构,编程风格,以及解决问题的思考方式。设计模式免去我们自己再思考和摸索。就像是经典的棋谱,不同的棋局,我们用不同的棋谱 俗称”套路“

单例模式

所谓类的单例模式 就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。如果我们要让类在一个虚拟机中只能产生一个对象 我们首先必须将类的构造器的访问权限设置为private,这样,就不能用new操作符在类的外部产生类的对象了,但在类的内部仍然可以产生该类的对象。因为在类的外部开始还无法得到类的对象,只能调用该类的某个静态方法 以返回类内部创建的对象,静态方法只能访问类中的静态成员变量,所以 指向类内部产生的该类对象的变量也必须定义成静态的。

具体写法如下(4种)

1.单例(Singleton)设计模式 - 饿汉式

class Singleton{

//1.私有化构造方法

private Singleton(){

}

//2.类的内部提供一个当前类的实例

//4.此实例也必须静态化

private static Singleton single = new Singleton();

//3.提供公共的 静态的 get方法

public static Singleton getInstance(){

return single;

}

}

此种方法是饿汉式

特点: 不管是否用到 先new一个新的实例

2.单例(Singleton)设计模式 - 懒汉式

class Singleton{

//1.私有化构造方法

private Singleton(){

}

//2.类的内部先声明当前类

//4.必须静态化

private static Singleton single;

//3.提供公共的静态的 get方法

public static Singleton getInstance(){

//判断当前实例是否为null

if(single == null){

//如果为null,则new一个实例

single = new Singleton();

}

return single;

}

}

懒汉式

特点:先声明实例 当用到时再new出实例 线程不安全

3.单例(Singleton)模式 - 双重锁式

class Singleton{

//1.提供私有的构造方法

private Singleton(){

}

//2.声明实例

private volatile static Singleton single;

//3.提供公共的 静态的 get方法

public static Singleton getInstance(){

if(single == null){

synchronized(Singleton.class){

if(single == null){

single = new Singleton();

}

}

}

return single;

}

}

双重锁式: 重写了懒汉式,线程安全

4.单例(Singleton)模式 - 静态内部类式

class Singleton{

//1.提供私有的构造方法

private Singleton(){

}

//2.创建静态内部类

class StaticSingleton{

//3.类中实例化外部类的对象,用static final修饰

//final 修饰对象 此对象不能再new实例

private static final Singleton single = new Singleton();

}

//4.提供公关的 静态的 get方法 获取内部类中的外部类实例对象

public static Singleton getInstance(){

return StaticSingleton.single;

}

}

测试方法:

通过单例模式设计的类 无论实例化几次 在内存中都会只想一个地址

实例化方法:

Singleton single = Singleton.getInstance();

验证方法:

Singleton single1 = Singleton.getInstance();

Singleton single2 = Singleton.getInstance();

System.out.println(single1 == single2);

如果输出结果为 true 则表示内存地址相等 设计成功

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。