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多线程中的单例模式两种实现方式的相关资料,需要的朋友可以参考下
使用"懒汉模式"与"饿汉模式"实现c++的单例模式,并且确保了单例模式的第一次实例化的线程安全,以及程序结束时,单例对象的资源收回,以防内存资源的泄漏
2020-02-10 王争设计模式之美进入课程讲述:冯永吉时长 10:21大小 8.31M上两节课中,我们针对单例模式,讲解了单例的应用场景、几种常见的代码实现
两种单例实现方式
今天在复习设计模式中的-创建型模式,发现JS实现单例模式的方案有很多种,稍加总结了一下,列出了如下的6种方式与大家分享 大体上将内容分为了ES5(Function)与ES6(Class)实现两种部分 单例模式就是在系统中...
单例模式主要有懒汉式和饿汉式两种实现,饿汉式不会有线程安全的问题,但是提前构造对象占用了一定的资源,如果对内存要求较低的场景可以使用饿汉式实现;懒汉式应使用DCL机制来避免多线程竞争资源的问题,并且懒汉...
设计模式之单利模式,两种单例模式的实现方法:恶汉式和懒汉式;
Qt两种方法实现多线程的开启,及子线程的安全结束线程,及QMutex加锁,Qt单例化实现
3、两种比较器以及sort()方法的重载: 结论:Icomparable接口在需要比较的类中实现;Icomparer接口在任何类中实现,使用时只需将这个类的对象作为参数传给Sort()就行。 4、接口的使用 结论:接口作为参数,即接口的...
单例模式的实现分为两种:饿汉式和懒汉式。前者是在静态构造函数执行时就立即实例化,后者是在程序执行过程中第一次需要时再实例化。两者有各自适用的场景,实现方式也都很简单,唯一在设计时要考虑的一个问题就是:...
本工程实现了一种利用静态工厂和单例模式两种模式思路设计的线程相关的单例模式。
ios单例模式的详细解释、两种方式实现单例模式,重写需要实现的方法
通常单例模式在Java语言中,有两种构建方式: 懒汉式—线程不安全:最基础的实现方式,线程上下文单例,不需要共享给所有线程,也不需要加synchronize之类的锁,以提高性能。 懒汉式—线程安全:加上synchronize之类...
下面让我们主要看一下前两种方式。 第一种方式,用new方法初始化其实是第二种方式的总和,当调用new方法时,其实是先调用了alloc方法进行isa(is a pointer)操作,创建指针,指向内存中的数据结构,紧接着调用了init...
主要介绍了Python单例模式的相关资料,这里提供了两种实现方法,及注意事项,需要的朋友可以参考下
这是关于单例模式的两种经典版本分析以及代码实现,以及附带了C++中双重检查技术来实现同步访问问题,单例模式在校园招聘的时候也是面试的经典题
前言 好久没写东西了,但是想着无论什么事还是要坚持自己初心要坚持的东西。写东西不能断! 对于常用的23种设计模式,这里笔者会根据自己学习和出现频率、...而单例模式也有很多的应用,比如很多驱动例如摄像头、打印
【设计模式】(四)–创建型模式–单例模式单例模式的定义饿汉式单例模式懒汉式...Java语言中实现单例通常有两种变现形式。 饿汉式单例模式:类加载时,就进行对象实例化 懒汉式单例模式:第一次引用类才进行对象实例化