一、单例模式介绍
Singleton模式是一种建型模式,指某个类采用Singleton模式,则在这类类创建后,只能产生一个实便供外部访问。并且提供一个全局访问点。
全局对象和Singleton模式有本质的区别,因为大量的使用全局对象对影响程序的质量,并且很多语言根本不支持全局变量。并且全局对象方式并不能阻止一个类对实例化多次。
二、单例的特点
1、单例只能有一个实例
2、单例必须自己为自己创建唯一的实例。
3、单例必须为其它对象提供这一唯一实例。
三、单例模式的应用
1、每台计算机可以由若干个打印机,但只能有一个Printer Spooler,避免有两个作业同时输出到打印机。
2、一个具有自动编号主键的表可以有多个用户同时使用,但数据库中只能有一个地方分配下一个主键。否则会出现主键重复。
四、单例模式使用注意
1、不要使用单例模式存取全局变量。这违背了单列模式的用意,最好放到对应类的静态成员中。
3、不要将数据库连接做成单例,因为一个系统可能与数据库有多个连接,并且在有连接池的情况下,应当尽可能及时释放连接。Singleton模式由于使用静态成员存储类实例,所以可能会造成资源无法及时释放。
五、单例模式的举例
(1)
/* 线程安全 但效率比较低 一开始就要加载类new一个 对象
这是饿汉方式的单例模式*/
public class Singleton1 {
private Singleton1(){
}
private static final Singleton1 instance=new Singleton1();
public static Singleton1 getInstancei(){
return instance;
}
}
(2)
// 饱汉方式的单例模式 但是有多个线程访问时就不是安全的 返回的不是同一个对象
public class Singleton {
private Singleton(){
}
private static Singleton instance;
public static Singleton getInstance() {
if (instance == null)
instance = new Singleton();
return instance;
}
}
(3)
//虽然是安全的 但是效率非常低在一个时候只有一个线程能访问 同时返回一个对象
public class Singleton2 {
private Singleton2(){
}
private static Singleton2 instance;
public static synchronized Singleton2 getInstance() {
if (instance == null)
instance = new Singleton2();
return instance;
}
}
(4)
/* 线程安全 并且效率高 能有多个线程访问*/
public class Singleton3 {
private static Singleton3 instance;
private Singleton3() {
}
public static Singleton3 getIstance() {
if (instance == null) {
synchronized (Singleton3.class) {
if (instance == null) {
instance = new Singleton3();
}
}
}
return instance;
}
}
(5)登记式
import java.util.HashMap;
import java.util.Map;
//登记式单例类.
//类似Spring里面的方法,将类名注册,下次从里面直接获取。
public class Singleton3 {
private static Map<String,Singleton3> map = new HashMap<String,Singleton3>();
static{
Singleton3 single = new Singleton3();
map.put(single.getClass().getName(), single);
}
//保护的默认构造子
protected Singleton3(){}
//静态工厂方法,返还此类惟一的实例
public static Singleton3 getInstance(String name) {
if(name == null) {
name = Singleton3.class.getName();
System.out.println("name == null"+"--->name="+name);
}
if(map.get(name) == null) {
try {
map.put(name, (Singleton3) Class.forName(name).newInstance());
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
return map.get(name);
}
//一个示意性的商业方法
public String about() {
return "Hello, I am RegSingleton.";
}
public static void main(String[] args) {
Singleton3 single3 = Singleton3.getInstance(null);
System.out.println(single3.about());
}
}
转自:http://wenku.baidu.com/view/db5006e981c758f5f61f678d.html?from_page=view&from_mod=download
http://www.cnblogs.com/whgw/archive/2011/10/05/2199535.html
分享到:
相关推荐
设计模式C++学习之单例模式(Singleton)
单例模式的七种实现方法以及分析,可以作文大作业提交 1.前言 4 1.1 课题的研究背景 4 1.2 课题主要研究目标 4 2.相关技术简介 4 2.1Java简介 4 2.2IDEA简介 4 3. 单例模式的7种实现方式 5 ...5.设计模式学习总结: 15
实用Java的单例模式,实用于Java学习者 单例模式 单例模式
设计模式-单例模式 学习时候联系的代码,可以进行参考
单例模式是个简单的java模式之一!有助于为学习后面的22种模式打下基础!
设计模式单例模式PPT学习教案.pptx
第 单例模式PPT学习教案.pptx
通过学习java 简单总结单例模式与装饰者模式,做一下入门总结,主要讲述单例模式中饿汉式与懒汉式的相同点与不同点,方便理解记忆。
单例模式,顾名思义,只有一个实例,因此这种模式只有在真正的需求“单一实例”的时候使用。它提供一种方法来确保某一特定类型有且只有一个实例。而且自行实例化,并向外部提供这个单一实例。 在它核心结构中,只...
java设计模式,单例模式学习示例源码,创建单例,配置文件读取
引入了单例模式来保证在全局调用中不会重复实例化这个类,降低系统资源的浪费,一个对象(在学习设计模式之前,需要比较了解面向对象思想)只负责一个特定的任务。 php的应用主要在于数据库应用, 所以一个应用中会...
Java单例模式代码,可能对初学者有用,贡献出来,也方便自己学习
《C++20设计模式》学习笔记-第5章单例模式
C#设计模式学习与演变过程-2-单例模式,通过代码的演变过程系统地学习单例模式,代码包括:简单单例、加锁单例、双检单例、饿汉式单例。
简单MVC模式结构,php,包括ajax,单例模式,适合php初级开发者学习 如有问题,
demo python使用装饰器(Decorator)的方式实现单例模式 functools.wraps 则可以将原函数对象的指定属性复制给包装函数对象, 默认有 __module__、__name__、__doc__,或者通过参数选择
最近在学习多线程相关知识,同时加深了对单例的理解,从并发的角度学习到了不同的单列模式,提供出来供大家一起学习
自己对于单例模式的一些学习总结
Unity单例模式模板类,以供学习,有两个: 一个单纯的Singleton 一个MonoSingleton,继承于MonoBehaviour
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 学习demo