菜鸟学习Java设计模式之单例模式
单例模式是一种常见的设计模式,在Java中被广泛应用。它的主要特点是可以创建一个全局唯一的对象,并且该对象只会被创建一次,多次调用时直接返回已经创建好的对象,以此来保证系统中的唯一性和一致性。
实现单例模式的步骤
要实现一个单例模式,我们需要经过以下几个步骤:
- 构造函数需要设置为私有,以防止其他地方直接通过new来创建对象;
- 定义一个私有的静态对象作为单例的唯一实例;
- 提供一个公共的静态方法来获取该对象实例,确保每次获取的都是同一个对象。
Java中实现单例模式的最常见方式是采用饿汉式和懒汉式两种方式,下面我们分别来看一下它们的实现方式。
饿汉式单例模式
饿汉式单例模式在类被加载时自行实例化,并且保证了线程安全。因为只要使用了这个类,就必定会创建对应的实例,所以它的名称被称为饿汉式。
下面是一段饿汉式单例模式的示例代码:
public class Singleton {
// 定义私有的静态实例对象,初始化为null
private static Singleton instance = null;
// 私有构造函数,防止外部new对象
private Singleton() {
}
// 静态公有方法,以获取该类唯一实例对象
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
在上面的示例代码中,我们定义了一个静态的私有实例对象instance,并将其初始化为null。同时,我们还定义了一个静态的公有方法getInstance(),该方法用于获取类的唯一实例对象。在getInstance()方法中,我们通过instance == null的条件判断,来判断该类是否已经被创建过对象实例。如果该类还未被创建过对象实例,就通过new Singleton()来创建一个新的实例,并将其赋值给instance,最后返回该实例即可。
懒汉式单例模式
懒汉式单例模式是在需要使用对象时才会去创建对象实例,此时才为对象分配内存等资源。懒汉式单例模式在用到对象时创建实例,但是需要防止多线程并发时出现问题。
下面是一段懒汉式单例模式的示例代码:
public class Singleton {
private static Singleton instance = null;
private Singleton() {
}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
在上面的实现方式中,我们同样将构造函数设置为私有的,同时定义了一个静态的私有实例对象instance,但是这里需要注意的是,在getInstance()方法中,我们使用了synchronized关键字,来保证在多线程并发时的线程安全。
单例模式优缺点分析
单例模式的优点:
- 它可以保证系统中的某个类只有一个实例,避免了对象的重复创建和内存的浪费;
- 由于它只会被实例化一次,所以可以节省系统的开销;
- 对象的唯一性可以有效地控制系统中的数据一致性和交互复杂性。
单例模式的缺点:
- 单例模式的应用范围比较局限,一般只适用于需要小量对象实例的场景;
- 单例模式的实现较为复杂,在多线程并发时需要考虑线程安全等问题,否则容易出现多线程并发时的问题。
示例说明
下面通过一个具体的示例来解释一下单例模式的应用。
比如在一款游戏中,我们需要对玩家进行统计,比如每天登录的人数、每个小时的游戏时长等,在不同的地方都需要用到这个统计对象,而且这个统计对象必须是全局唯一的,所以此时就可以采用单例模式来实现。
public class GameStatistics {
private int dailyActiveUsers;
private int hourlyPlayTime;
// 饿汉式单例模式实现
private static GameStatistics instance = new GameStatistics();
private GameStatistics() {
}
public static GameStatistics getInstance() {
return instance;
}
// 省略了getter和setter等方法
}
在上面的示例代码中,我们创建了一个GameStatistics类,用于记录游戏的统计信息。由于每个玩家在游戏中只会有一个统计对象,所以我们可以使用饿汉式的单例模式来实现。在GameStatistics类中,我们将构造函数设置为私有的,并定义一个静态的私有实例对象instance,同时还提供了一个公有的静态方法getInstance()来获取该实例对象。
在具体使用该单例实例对象时,我们可以通过GameStatistics.getInstance()来获取该对象,实现了全局唯一的效果。比如下面的代码片段就可以用来更新统计数据:
GameStatistics statistics = GameStatistics.getInstance();
statistics.setDailyActiveUsers(1000);
statistics.setHourlyPlayTime(3600);
在上面的代码片段中,我们首先通过GameStatistics.getInstance()来获取GameStatistics类的唯一实例对象,随后再通过setter方法来更新统计数据。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:菜鸟学习java设计模式之单例模式 - Python技术站