所谓设计模式(Design Pattern),是为了满足对优秀、简单而且可重用的解决方案的需要。这就像我们在盖楼的时候,我们不会每次都从零开始来画图纸,而是参照某种已有的模式,然后在此基础上来设计它。而在面向对象程序设计中,“模式”是为了实现重用面向对象代码的一种方便做法。
根据“设计模式”的经典著作《Design Patterns:Elements of reusable Object-Oriented software》中所述,设计模式一般包含四个基本要素:
1.模式名称(pattern name):一个助记名,用几个词汇来描述模式的问题、解决方案以及效果。
2.问题(problem):描述了应该在何时使用模式。
3.解决问题的方案(solution):描述了设计的组成部分,它们之间的相互关系及各自的职责和协作方式。
4.效果(consequences):描述了模式应用的效果及使用模式应权衡的问题。
我们现在来考虑单子(Singleton)设计模式的需求背景。
在实际应用中,我们可能需要限制生成的对象个数只能为1个。比如,在开发图形应用的时候,在菜单栏上按下“帮助”菜单,将弹出一个帮助对话框,也就是生成了一个帮助对话框的实例,如果对话框已经出现,则即使再在菜单栏上按下“帮助”菜单,应用程序也不应该再生成新的对话框实例。这个时候,如果还是通过原来的用构造器来生成实例的方式,很难对其生成的实例个数进行控制。通过所谓的“单子设计模式”,可以实现这个功能。
单子设计模式的基本思路是在类的内部定义一个静态变量,当创建第一个实例时设置该变量。应用程序直接使用这个静态变量指向的实例就可以了。为了防止应用程序调用构造器来新建实例,必须限制构造器的访问,也就是将它的访问控制设置为“private”。
概括起来,要实现“单子设计模式”,可以利用下面的方式来完成:
创建一个类,满足:
构造器私有;
用一个私有、静态变量引用实例;
提供一个公有、静态方法获得实例。
下面来看一个这个实现的例子:
public class SingletonPattern {
private double r;
// 定义一个私有、静态的引用变量
private static SingletonPattern sp;
// 构造器私有
private SingletonPattern() {
r = java.lang.Math.random();
}
// 提供一个公有、静态方法获得唯一实例
public static SingletonPattern getInstance() {
if (sp == null)// 如果还未创建实例
{
sp = new SingletonPattern();// 则创建一个实例
}
return sp;// 将它返回
}
public double getR() {
return r;
}
public static void main(String args[]) {
SingletonPattern sp1 = SingletonPattern.getInstance();
SingletonPattern sp2 = SingletonPattern.getInstance();
System.out.println(sp1.getR());
System.out.println(sp2.getR());
}
}
在这个例子中,我们利用上面所讨论的方法实现了“单子设计模式”,为了简单的测试我们每次得到的对象是否为同一个对象,我们在构造器中给该类的实例变量r赋了一个随机的值。如果每次得到的实例是同一个,那么,它的实例变量r的值也必定相同。
为了测试这个类,在这个类中定义了一个main()方法,然后通过SingletonPattern类的静态方法getInstance()来获得两个SingletonPattern实例,分别赋给两个引用变量sp1和sp2,然后通过这两个实例的getR()方法将它的实例变量打印出来。运行上面的程序,可以得到类似如下的输出:
0.04960654267464748
0.04960654267464748
这说明,这两个引用变量指向的是同一个实例,也就是只有一个实例存在。因为这个类的构造器被定义为“private”,所以不能直接调用它的构造器来生成新的实例,这也就避免了通过直接调用构造器生成多个实例的情况。
分享到:
相关推荐
下面将详细介绍七种常见的单例模式实现方式,并结合多线程环境和反序列化测试进行讨论。 1. **饿汉式单例**: 这是最简单的单例实现,它在类加载时就创建了实例,因此是线程安全的。 ```java public class ...
在Java中,我们可以使用多种方式来实现单例模式: 1. **饿汉式(静态常量)**:这是最简单的单例实现方式,它在类加载时就完成了初始化,所以类加载比较慢,但获取对象的速度快,且线程安全。 ```java public class...
单例模式是软件设计模式中的一种基础且广泛应用的模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。在Java中,实现单例模式有多种...在理解了各种实现方式后,才能更好地利用单例模式解决实际问题。
总结来说,C++中的单例模式实现要考虑线程安全和生命周期管理,尤其是在多线程环境下。上述的三种方法分别适用于不同的场景,开发者应根据实际需求选择合适的方式。在实际编程中,还需注意防止内存泄漏,确保单例...
在Java、C#等面向对象语言中,实现单例模式有多种方法,下面我们将详细探讨五种常见的单例模式实现方式: 1. **饿汉式单例**: 这种方式是在类加载时就完成实例化,避免了线程同步问题。由于实例在类加载时已经...
实现单例模式主要有两种方式:饿汉式和懒汉式。 ### **饿汉式单例模式** 饿汉式单例模式在类加载时就完成了实例化,因此也称为静态初始化。这种方式保证了线程安全,但可能会造成不必要的资源浪费,因为即使未使用...
4. **静态内部类单例模式**:利用Java类加载机制保证初始化实例时只有一个线程,避免了同步问题。同时,由于静态内部类不会随着外部类的加载而加载,所以也实现了延迟初始化。 ```java public class Singleton { ...
单例模式在软件开发中具有重要意义,不仅可以控制资源的有效利用,还能简化系统架构。不同的单例模式各有优劣,开发者应根据实际情况选择最适合的方式。例如,在需要提前加载的场合,可以选择饿汉式;而在资源占用...
在Android Studio 3.0.1的环境下,开发者可以利用这些单例模式进行项目开发,优化代码结构,提高代码的可维护性和效率。同时,理解并掌握单例模式的实现方式及其在特定环境下的注意事项,是每个Android开发者必备的...
本篇文章将深入探讨如何在Java中实现单例模式,以及如何创建一个工具类来封装单例的创建。 首先,让我们了解单例模式的几种常见实现方式: 1. 饿汉式(静态常量): 这是最简单的单例实现,它在类加载时就完成了...
在C#中,我们可以利用单例模式来创建一个计数器类,以确保在整个应用程序的生命周期内,计数器只存在一个实例,并且能够被多个对象安全地共享和访问。 首先,我们需要理解单例模式的基本原理。单例模式的关键在于...
以下将详细介绍Java中实现单例模式的五种方法。 1. 饿汉式(静态常量) 这是最简单的单例实现方式,它在类加载时就完成了初始化,所以是线程安全的。饿汉式的优点是实现简单且线程安全,但缺点是如果单例对象长时间...
单例模式的实现通常有以下几种方式: 1. **饿汉式(静态常量)**:这是最简单的单例实现方式,它在类加载时就完成了初始化,所以是线程安全的。代码如下: ```java public class Singleton { private static final...
单例模式是软件设计模式中的一...这些习题可能涉及如何实现和优化上述不同类型的单例模式,以及在特定场景下选择哪种实现方式更合适。通过解答这些问题,你可以深入理解单例模式的原理,掌握其在实际项目中的应用技巧。
单例模式的实现方式主要有三种:饿汉式、懒汉式以及静态内部类方式。 - **饿汉式** - **实现**: ```java public class Single1 { // 创建一个静态的实例 private static Single1 instance = new Single1(); ...
单例模式是软件设计模式中的一种,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,比如控制资源的唯一性、...在实际应用中,应根据项目需求来决定采用哪种单例模式。
实现单例模式的关键在于防止其他对象通过常规构造函数创建新的实例。这通常通过私有化构造函数和提供一个公共静态方法(称为单例工厂方法)来实现。在Java中,单例模式的实现有多种方式: 1. 饿汉式(Static ...
总结一下,单例模式在Java中的实现有多种方式,饿汉式和懒汉式是最常见的两种。饿汉式通过提前初始化确保线程安全,但可能造成资源浪费;而懒汉式则延迟初始化以节省资源,但需要处理线程安全问题。双检锁的懒汉式在...
接下来,我们将详细讨论单例模式的实现方式,包括懒汉式和饿汉式,以及如何通过同步枷锁来保证线程安全。 1. **懒汉式**(Lazy Initialization):懒汉式单例模式的特点是在第一次需要时才创建对象,即延迟初始化。...
这些视频可能涵盖了单例模式的基本概念、实现方式、优缺点、适用场景以及可能遇到的问题,如序列化时如何保持单例、如何在多线程环境下正确实现单例等。观看这些视频,可以更深入地理解并掌握Java中的单例模式,从而...