Singleton模式
当要使用单例模式时,最常用的是Singleton模式:
public class Singleton {
private static Singleton theInstance = null;
private Singleton(){}
public static Singleton Instance(){
if(theInstance == null)
theInstance = new Singleton();
return theInstance;
}
}
优点:
- 跨平台:使用合适的中间件(例如RMI),可以把Singleton模式扩展为跨多个JVM和多个计算机工作。
- 适用于任何类:只需要把一个类的构造函数变成私有的,并且在其中增加相应的静态函数和变量,就可以把这个类变为Singleton。
- 可以透过派生创建:给定一个类,可以创建它的一个Singleton子类。
- 延迟求值:如果Singleton为被使用过,那么就决不会创建它。
缺点:
- 摧毁方法未定义:没有好的方法去摧毁一个Singleton,或者解除其职责。即使添加一个decommission方法把theInstance转为null,系统中的其他模块仍然持有对该Singleton实例的引用。这样,随后对Instance方法的调用会创建另外一个实例,致使同时存在两个实例。这个问题在C++中成为严重,因为实例可以被摧毁,可能会导致去提领一个已被摧毁的对象。
- 不能继承:从Singleton类派生出来的类并不是。如果要使其dnylSingleton,必须要增加所需的静态函数和变量。
- 效率问题:每次调用Instance方法都会执行if语句。就大多数调用而言,if语句是多余的。
- 不透明性:Singleton的使用都知道它们正在使用一个Singleton,因为它们必须要调用Instance方法。
Monostate模式
单例的另一种实现是Monostate模式,
public class MonoState {
private static int x = 0;
public MonoState(){}
public void setX(int x){
this.x = x;
}
public int getX(){
return x;
}
}
无论创建了多少Monostate实例,他们都表现得像一个对象一个。这就是两个模式的区别,一个关注行为,一个关注结构。Singelton模式强制结构上的单一性。它防止创建出多个对象实例,相反,Monostate模式则强制行为上的单一性,而不有强加结构方面的限制。Monostate的测试用例对Singleton都是有效的,但Singleton的测试用例却不适用于Monostate类。
优点:
- 透明性:使用Monostate对象和使用常规对象没有什么区别。使用者不需要知道对象是Monostate。
- 可派生性:Monostate的派生类都是Monostate。事实上,Monostate的所有派生类都是同一个Monostate的一部分。它们共享相同的静态变量。
- 多太性:由于Monostate的方法不是静态的,所以可以在派生类中复写它们。因此,不同的派生类可以基于同样 的静态变量表现出不同的行为。
缺点:
- 不可黑气性:不能透过派生把常规类转换成Monosate类。
- 效率问题:因为Monostate是真正的对象,所以会导致许多 的创建和摧毁开销。
- 内存占用:即使从未使用Monostate,它的变量也要占据内存空间。
- 平台局限性:Monostate不能跨过多个JVM或者多个平台工作。
分享到:
相关推荐
Java多线程中的单例模式两种实现方式 单例模式是Java中一种常用的设计模式,用于限制一个类只能有一个实例对象。然而,在多线程环境下,单例模式的实现变得更加复杂。 Java多线程中的单例模式两种实现方式主要介绍...
这个讲的是单例模式的多种不同实现方式,希望对单例感兴趣的同学看看
### JAVA单例模式的几种实现方法 #### 一、饿汉式单例类 饿汉式单例类是在类初始化时就已经完成了实例化的操作。这种实现方式简单且线程安全,因为实例化过程是在编译期间完成的,不会受到多线程的影响。 **代码...
"设计模式单例模式和工厂模式综合应用"的主题聚焦于两种常用的设计模式:单例模式和工厂模式,并探讨它们如何协同工作来实现高效、灵活的代码结构。这个主题尤其适用于Java编程语言,因为Java的面向对象特性使得设计...
单例模式是软件设计模式中的一种经典模式,它...通过阅读和分析这些代码,你可以更深入地理解这两种模式的实现细节及其在实际开发中的作用。同时,也可以尝试自己编写并测试不同的单例实现,以加深对单例模式的理解。
使用"懒汉模式"与"饿汉模式"实现c++的单例模式,并且确保了单例模式的第一次实例化的线程安全,以及程序结束时,单例对象的资源收回,以防内存资源的泄漏
在本文中,我们将深入探讨三种工厂设计模式——简单工厂模式、抽象工厂模式和工厂方法模式,以及两种单例模式——饿汉单例模式和懒汉单例模式。这些模式都是面向对象设计中的重要组成部分,对于理解和构建可维护、可...
实现单例模式主要有两种方式:饿汉式和懒汉式。 ### **饿汉式单例模式** 饿汉式单例模式在类加载时就完成了实例化,因此也称为静态初始化。这种方式保证了线程安全,但可能会造成不必要的资源浪费,因为即使未使用...
在Java、C#等面向对象语言中,实现单例模式有多种方法,下面我们将详细探讨五种常见的单例模式实现方式: 1. **饿汉式单例**: 这种方式是在类加载时就完成实例化,避免了线程同步问题。由于实例在类加载时已经...
在 Java 中,单例模式可以通过两种方式来实现:类加载时进行对象的实例化和第一次访问时进行对象的实例化。 类加载时进行对象的实例化 在这种方式下,单例对象是在类加载时实例化的。下面是一个简单的示例代码: ...
本次我们将深入探讨两种设计模式——单例模式和装饰模式,它们在Java编程中都有着广泛的应用。 首先,让我们来理解“单例模式”。单例模式是一种创建型设计模式,其核心思想是保证一个类只有一个实例,并提供一个...
单例模式是软件设计模式中的一种基础且广泛应用的模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在系统中需要频繁创建和销毁对象,且对象创建成本较高,或者需要共享资源的情况下非常...
SQLite3则是一个轻量级的嵌入式数据库,而MVC和单例模式是软件设计中的两种重要概念。 首先,让我们理解MVC设计模式。MVC将应用程序分为三个主要组件:模型(Model)、视图(View)和控制器(Controller)。模型...
- **获取单例实例的方法**:一般有两种实现方式,懒汉式(延迟初始化,线程不安全)和饿汉式(提前初始化,线程安全)。为了在多线程环境下保证线程安全,还可以采用双检锁/双重校验锁定(DCL,Double-Check ...
在这个场景中,我们将探讨如何使用单例模式来创建一个学生管理系统,主要涉及“饿汉式”和“懒汉式”两种实现方式。 **饿汉式单例** 饿汉式单例在类加载时就完成了实例化,因此它是线程安全的。这种方式保证了单例...
这种方式结合了前两种方法的优点,既延迟初始化又保证线程安全。 ```java public class Singleton { private volatile static Singleton instance; private Singleton() {} public static Singleton ...
在给定的标题和描述中,我们关注的是两种重要的设计模式:单例模式和观察者模式。 首先,让我们深入了解单例模式。单例模式是一种确保一个类只有一个实例,并提供全局访问点的设计模式。这种模式在资源管理、缓存、...
每种实现方式都有其优缺点,选择哪种方式取决于特定的应用场景,如性能需求、线程安全性和代码简洁性等因素。单例模式虽然方便,但过度使用可能导致设计复杂度增加,不易测试,以及违反了单一职责原则,因此在实际...