单例模式是设计模式中使用很频繁的一种模式,在各种开源框架、应用系统中多有应用.像在ORM框架中就使用频繁。
一、定义与结构
单例模式又叫做单态模式或者单件模式。在GOF书中给出的定义为:保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式中的“单例”通常用来
代表那些本质上具有唯一性的系统组件(或者叫做资源)。比如文件系统、资源管理器等等。
二、单例模式的目的就是要控制特定的类只产生一个对象,当然也允许在一定情况下灵活的改变对象的个数。
那么怎么来实现单例模式呢?一个类的对象的产生是由类构造函数来完成的,如果想限制对象的产生,就要将构造函数变为私有的(至少是受保护的),使得外面的
类不能通过引用来产生对象;同时为了保证类的可用性,就必须提供一个自己的对象以及访问这个对象的静态方法。(只有一个实例对象叫单实例了)
单例模式可分为有状态的和无状态的。有状态的单例对象一般也是可变的单例对象,多个单态对象在一起就可以作为一个状态仓库一样向外提供服务。没有状态的单例对象也就是不变单例对象,仅用做提供工具函数。
三、实现方法
饿汉式:
public class DumpDemo {
private static DumpDemo instance = new DumpDemo();
private DumpDemo() {}
//静态工厂方法,提供一个供外部访问得到对象的静态方法
public static DumpDemo getInstance() {
return instance;
}
懒汉式:
public class DumpDemo {
private static DumpDemo instance = null;
private DumpDemo() {}
//静态工厂方法,提供一个供外部访问得到对象的静态方法
public static synchronized DumpDemo getInstance() {
if (instance == null) {
instance = new DumpDemo();
}
return instance;
}
先让我们来比较一下这两种实现方式:
首先他们的构造函数都是私有的,彻底断开了使用构造函数来得到类的实例的通道,但是这样也使得类失去了多态性(大概这就是为什么有人将这种模式称作单态模式)。
在第二种方式中,对静态工厂方法进行了同步处理,原因很明显——为了防止多线程环境中产生多个实例;而在第一种方式中则不存在这种情况。(防止多线程过来的破坏)
在第二种方式中将类对自己的实例化延迟到第一次被引用的时候。而在第一种方式中则是在类被加载的时候实例化,这样多次加载会照成多次实例化。但是第二种方式由于使用了同步处理,在反应速度上要比第一种慢一些。
以上两种实现方式均失去了多态性,不允许被继承。还有另外一种灵活点的实现,将构造函数设置为受保护的,这样允许被继承产生子类。
PS:如果父类的构造方法是私有的话就不可以被继承了。注意哦单例模式中如果父类中用到了私有方法的话就不可以被构造了
在GOF中认为最好的一种方式是维护一张存有对象和对应名称的注册表(可以使用HashMap来实现)
代码如下:
import java.util.HashMap;
public class DumpDemo {
private static HashMap sinRegistry = new HashMap();
static private DumpDemo s = new DumpDemo();
protected DumpDemo() {}
//静态工厂方法,提供一个供外部访问得到对象的静态方法
public static DumpDemo getInstance(String name) {
if(name == null)
name = "Singleton";
if(sinRegistry.get(name)==null){
try{
sinRegistry.put(name , Class.forName(name).newInstance());
}catch(Exception e)
{
e.printStackTrace();
}
}
return (DumpDemo)(sinRegistry.get(name));
}
public void test()
{
System.out.println("getclasssuccess!");
}
}
class SingletonChild1 extends DumpDemo
{
public SingletonChild1(){} static public SingletonChild1 getInstance() { //子类中可以获取到一个实例
return (SingletonChild1)DumpDemo.getInstance("SingletonChild1");
} public void test()
{ System.out.println("getclasssuccess111!");
}
转自:http://it.chinawin.net/softwaredev/article-ea49.html
相关推荐
Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式...
单例模式是软件设计模式中的一种经典模式,用于确保一个类只有一个实例,并提供一个全局访问点。在Java中,有多种实现单例模式的方法,每种都有其特点和适用场景。接下来,我们将深入探讨这些实现方式。 首先,我们...
实用Java的单例模式,实用于Java学习者 单例模式 单例模式
在Java编程中,单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点。这种模式在需要频繁创建和销毁对象的场景中尤其有用,因为它可以节省系统资源并确保对象间的协调一致。以下是...
单例模式是软件设计模式中的一种经典模式,其主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在Java中广泛应用于控制资源的共享,例如数据库连接池、线程池或者配置对象等。在Java中,通常有三种...
Java中的单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供全局访问点。在Java编程中,单例模式常用于控制资源的访问,比如数据库连接池、线程池或者日志对象等。本篇文章将深入探讨如何在Java中...
单例模式是一种常用的软件设计模式,在这种模式中,一个类只能拥有一个实例,并且该类必须自行创建并提供这个实例。通常,单例模式用于确保某个类在整个应用程序生命周期中只存在一个实例,这有助于节省资源并简化对...
单例模式是软件设计模式中的一种,用于控制类的实例化过程,确保一个类只有一个实例,并提供全局访问点。在Java中,实现单例模式有多种方法,每种方法都有其特点和适用场景。以下是对这六种常见单例模式实现方式的...
Java中懒汉单例设计模式线程安全测试,单例设计模式的测试
Java中的单例模式是一种设计模式,它用于保证一个类只有一个实例,并提供一个全局访问点。这种模式在系统中需要控制实例数量,特别是当这个实例需要频繁地被多个对象共享时非常有用,例如数据库连接池、线程池或者...
单例模式是设计模式中的一种,它在Java编程中被广泛应用,主要目的是限制类的实例化,确保在程序运行期间,对于某个特定类,只存在一个全局共享的对象。这种模式通常用于那些需要频繁实例化然后销毁,或者创建代价...
Java 单例模式 懒汉模式 //懒汉式 多线程中不可以保证是一个对象
**代码**文件则提供了实际的Java实现,通过查看这些代码,我们可以看到单例模式和工厂模式如何在实践中被运用,包括类的定义、方法的实现以及如何通过代码调用来创建和管理对象。 总的来说,这个项目为学习和理解...
在MVC模式中,Model层管理数据以及业务逻辑,View层负责将数据展示给用户,而Controller层则充当Model和View之间的桥梁角色。Controller负责接收用户的输入,然后根据输入去更新Model层的数据,Model层更新完成后,...
通过单例模式实例化获取propertyUtil 工具包实例,高效加载配置文件,java语言编写。通过单例模式实例化获取propertyUtil 工具包实例,高效加载配置文件,java语言编写。通过单例模式实例化获取propertyUtil 工具包...
### Java单例模式应用研究 #### 一、单例模式概述 单例模式(Singleton Pattern)作为一种最基本的创建型设计模式,其主要目的是控制一个类的实例化过程,确保在整个应用程序中仅存在一个实例,并且该实例能够被全局...
Java单例模式是一种设计模式,它允许在程序中创建唯一一个类实例,通常用于管理共享资源,例如数据库连接、线程池或者配置对象等。单例模式的核心在于限制类的构造函数,确保类只能被初始化一次,从而实现全局唯一的...
在这些模式中,单例模式是最为广泛使用的一种。单例模式确保一个类只有一个实例,并提供一个全局访问点,使得在整个应用程序中,无论何处都可以方便地调用这个唯一的实例。 单例模式的主要优点在于它可以控制实例化...
Java的单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供全局访问点。在Android开发中,单例模式的应用尤其广泛,因为它能够有效管理资源,减少内存开销,提高性能。以下是对单例模式在Android中...