如何实现单例模式?这个模式保护类的创建过程来确保只有一个实例被创建,它通过设置类的构造方法为私有来达到这个目的 。要获得类的实例,单例类可以提供一个方法,如getInstance,来返回类的实例 。该方法是唯一可以访问类来创建实例的方法 。下面是单例的一个例子:Java代码publicclassSingletonPattern{privatestaticSingletonPatterninstance;privateSingletonPattern(){}publicstaticsynchronizedSingletonPatterngetInstance(){if(instance==null){instance=newSingletonPattern();}returninstance;}}当我们要实现单例的时候 , 有如下的规则需要遵循:从上面的示例代码中可以看出,一个单例类有一个静态的属性来保存它唯一的实例需要将类的构造方法设置为private 。这样你不允许其他任何类来创建单例类的实例 , 因为它们不能访问单例类的构造方法 。
如何写一个标准的Java单例模式java中单例模式是一种常见的设计模式java单实例类代码,单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种 。
单例模式有一下特点:
1、单例类只能有一个实例 。
2、单例类必须自己自己创建自己的唯一实例 。
3、单例类必须给所有其他对象提供这一实例 。
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例 。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例 。这些应用都或多或少具有资源管理器的功能 。每台计算机可以有若干个打印机 , 但只能有一个Printer Spooler , 以避免两个打印作业同时输出到打印机中 。每台计算机可以有若干通信端口 , 系统应当集中管理这些通信端口 , 以避免一个通信端口同时被两个请求同时调用 。总之,选择单例模式就是为了避免不一致状态,避免政出多头 。
首先看一个经典的单例实现 。
public class Singleton {
private static Singleton uniqueInstance = null;
private Singleton() {
// Exists only to defeat instantiation.
}
public static Singleton getInstance() {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
// Other methods...
}
Singleton通过将构造方法限定为private避免了类在外部被实例化,在同一个虚拟机范围内 , Singleton的唯一实例只能通过getInstance()方法访问 。(事实上,通过Java反射机制是能够实例化构造方法为private的类的,那基本上会使所有的Java单例实现失效 。此问题在此处不做讨论,姑且掩耳盗铃地认为反射机制不存在 。)
但是以上实现没有考虑线程安全问题 。所谓线程安全是指:如果java单实例类代码你的代码所在的进程中有多个线程在同时运行 , 而这些线程可能会同时运行这段代码 。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的 。或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说java单实例类代码我们不用考虑同步的问题 。显然以上实现并不满足线程安全的要求,在并发环境下很可能出现多个Singleton实例 。
//////////////////////////////////////////////////////////////////////
验证单例模式的示例
//////////////////////////////////////////////////////////////////////
public class TestStream {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
推荐阅读
- pdf转cdm格式,pdf如何转换成cdr格式
- 提取字符串冒号报错python,python 提取字符串中的数值
- 虚拟主机主机记录,虚拟主机的fqdn
- 近距离拍摄用什么相机,近距离拍摄用什么相机和镜头
- 如何用c语言写延时函数 如何用c语言写延时函数的方法
- 朗泽sap,朗泽幼小衔接
- 鸿蒙系统安装风险app闪退,鸿蒙系统安装风险app闪退怎么办
- 区块链文化城市,区块链文化产业链
- mysql登录密码怎么改 mysql如何修改登录密码