java单例模式的实现方法_Java设计模式之单例模式的设计思路与具体实现

用单例模式设计类

Java中的一个类,理论上可以创建无数个对象。

假如我们只允许一个类创建一个对象,就需要会使用单例模式来设计该类。

单例模式的应用场景

Windows的任务管理器、回收站; 网站的计数器; 数据库连接池的设计;…

单例模式的设计思想

首先,一个类可以成功创建一个对象是因为在new对象的时候自动执行了该类默认的空构造,这个默认构造是公有的/public,所以我们可以在类外部无限new对象。

由此,我们可以得到第一步设计思路:

自定义一个构造方法,将该构造方法设计为私有的/private。 (但此时在该类外部一个对象也创建不出来)

私有化构造方法后,在类外部无法创建对象,那么我们可以考虑在该类内部直接创建对象。

则有第二步设计思路:

首先在该类内部声明一个本类类型的引用指向本类类型的对象; 然后用 private static 共同修饰该对象。 (使用 private 修饰是为了保证在该类外部无法得到该对象; 使用 static 修饰是为了保证这个对象仅创建一次,即只在类加载的时候创建一次)

对象创建完成后,我们只需要在类中再创建一个公有的静态访问方法,来保证我们可以在该类外部拿到这个唯一创建的对象。

第三步设计思路:

提供一个公有的静态get方法,该方法的返回值类型为本类类型。 即 public static 修饰该方法。 (使用static修饰该方法是因为本类已无法在外部new对象,不用static修饰的话也就无法调用该方法)

至此,单例模式的设计就已全部完成。

以上设计思路得到的是单例模式的饿汉式,饿汉式与懒汉式的区别下边会讲到。我们先通过饿汉式的代码实现对照上述设计思路来理解单例模式的设计过程,明白它为什么只能new出一个对象。

饿汉式代码实现

// 单例模式之饿汉式

public class SingletonForHungry{

// 第一步:私有化构造方法

private SingletonForHungry() {}

// 第二步:声明本类类型的引用指向本类类型的对象

private static SingletonForHungry sh = new SingletonForHungry();

// 第三步:提供公有的静态get方法将对象返回

public static SingletonForHungry getInstance() {

return sh;

}

}

单例模式的饿汉式和懒汉式饿汉式:在声明对象的时候直接创建对象,在get方法中直接返回;

懒汉式:在声明对象的时候先声明为null对象, 然后在get方法中判断该对象为null时创建本类对象,否则返回已存在的对象;

懒汉式代码实现

// 单例模式之懒汉式

public class SingletonForLazy{

// 第一步:私有化构造方法

private SingletonForLazy() {}

// 第二步:声明一个本类类型的null对象

private static SingletonForLazy sl = null;

// 第三步:提供公有的静态的get方法将对象返回

public static SingletonForLazy getInstance() {

// 判断sl是否为null

if (null == sl) {

sl = new SingletonForLazy();

}

return sl;

}

}

测试验证

验证这两种设计模式是否分别仅能得到一个对象

public class SingletonTest {

public static void main (String[] args) {

// 饿汉式

SingletonForHungry sh1 = SingletonForHungry.getInstance();

SingletonForHungry sh2 = SingletonForHungry.getInstance();

System.out.println(sh1 == sh2);

// 懒汉式

SingletonForLazy sl1 = SingletonForLazy.getInstance();

SingletonForLazy sl2 = SingletonForLazy.getInstance();

System.out.println(sl1 == sl2);

}

}

结果如下:

结果都为true,说明懒汉式和饿汉式的两个引用分别都指向的是同一个对象,单例模式设计正确。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值