设计模式笔记——单例模式

单例模式,又叫单态模式或者单件模式。

定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例通常用来代表那些本质上具有唯一性的系统组件(资源)。

目的:控制特定的类只产生一个对象。

单例模式可以分为有状态和无状态的。有状态的单例对象一般也是可变的单例对象,多个单例对象在一起可以作为一个状态仓库向外提供服务。没有状态的对象就是不变的单例对象,仅仅作用提供工具函数。

饿汉式:先new 出来实例,再返回。

 1 public class Singleton {
 2
 3   private static Singleton instance = new Singleton();
 4
 5   private Singleton () {
 6   }
 7
 8   public static Singleton getInstance() {
 9     return instance;  
10   }
11
12 }

懒汉式:调用的时候再new出实例。  使用synchronized 防止多线程环境产生多个实例,饿汉式不存在这种情况。

 

 1 public class Singleton {
 2     private static Singleton instance = null;
 3
 4     private Singleton() {
 5     }
 6
 7     public static synchronized Singleton getInstance() {
 8         if (instance == null) {
 9             instance = new Singleton();
10         }
11
12         return instance;
13     }
14 }

以上两种实现方式均失去了多态性,不允许被继承。

带有注册表的方式

带有注册表的实现(HashMap):

 1 import java.util.HashMap;
 2
 3 public class Singleton
 4 {
 5     private static HashMap sinRegistry = new HashMap();
 6
 7     static Singleton() {}
 8
 9     public static Singleton getInstance(String name) {
10         if (name == null) {
11             name = "Singleton";
12         }
13
14         if (sinRegistry.get(name) == null) {
15             try {
16                 sinRegistry.put(name, Class.forName(name).newInstance());
17             } catch (Exception e) {
18                 e.printStackTrace();
19             }
20         }
21
22         return (Singleton) (sinRegistry.get(name));
23     }
24
25     public void test () {
26         System.out.println("getclasssucess!");
27     }
28 }
29
30 public class SingletonChild1 extends Singleton
31 {
32     public SingletonChild1() {}
33
34     public  static SingletonChild1 getInstance() {
35         return (SingletonChild1) Singleton.getInstance("SingletonChild1");
36     }
37
38     public void test() {
39         System.out.prinln("getclasssuccess111!");
40     }
41 }

单例模式在Java中的陷阱:

1. 多个虚拟机,或者分布式系统中,当系统单例类被拷贝运行在多个虚拟机下的时候,每一个虚拟机下都可以创建一个实例对象。因此在使用分布系统时,应该避免使用单利模式。

2.多个类加载器,当存在多个类加载器的时候,因为不同的类加载器会使用不同的namespace来区分同一个类,因此,单例类在多加载器环境下会产生多个单例对象。

3.错误的同步处理,使用懒汉模式时候要对同步有所了解,否则会引发死锁错误或者得不到单例效果。饿汉模式不存在该问题。

4.子类破坏了对象控制

5.串行化。一个串行化的对象在每次返回串行化的时候都会创建新的对象,而不仅仅是一个对原有对象的引用。为防止这种情况,除了在生命中添加implements Serializable, 还可以在单例中加入readResolve方法。

永远单例:  public static final Singleton INSTANCE = new Singleton();

时间: 2024-10-27 17:49:49

设计模式笔记——单例模式的相关文章

设计模式 笔记 单例模式 Singleton

//---------------------------15/04/09---------------------------- //Singleton 单例模式-----对象创建型模式 /* 1:意图: 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 2:动机 3:适用性: 1>当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时. 2>当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码 就能使用一个扩展的实例时. 4:结构: Singleton: stati

php设计模式笔记:单例模式

意图: 保证一个类仅有一个实例,并且提供一个全局访问点 单例模式有三个特点: 1.一个类只有一个实例2.它必须自行创建这个实例3.必须自行向整个系统提供这个实例 主要实现: Singleton定义了一个instance操作,允许外部访问它的唯一实例,instance是一个类方法,负责创建它的唯一实例. singleton适用场景: 1.当类只能有一个实例而且外部可以从一个公共的访问点访问它.2.当这个唯一实例应该是通过子类化可扩展的.并且用户应该无需更改代码就能使用一个扩展的实例时. Singl

C#设计模式(1)——单例模式

一.引言 最近在设计模式的一些内容,主要的参考书籍是<Head First 设计模式>,同时在学习过程中也查看了很多博客园中关于设计模式的一些文章的,在这里记录下我的一些学习笔记,一是为了帮助我更深入地理解设计模式,二同时可以给一些初学设计模式的朋友一些参考.首先我介绍的是设计模式中比较简单的一个模式——单例模式(因为这里只牵涉到一个类) 二.单例模式的介绍 说到单例模式,大家第一反应应该就是——什么是单例模式?,从“单例”字面意思上理解为——一个类只有一个实例,所以单例模式也就是保证一个类只

最常用的设计模式(单例模式)

记得刚开始涉足程序的时候, 去笔试 ,发现有一个笔试题经常粗线,写一个单例模式的基本实现, 当时没研究设计模式也就不知为何物, 到今日  , 才发现它已成为我日常开发最常用的一种设计模式. 我写的所有设计模式的代码都会用java 呈现, 虽然第一个学习的是c++但是 最开始作为工作的是java,并且有点偏好java 单例模式 , 意思就是 整个系统仅只有此类的一个实力, 当然这只是狭义的单例,经常看到变种的单例是允许,创建指定数量的实例的 单例模式是一种创建型模式. 它是优化的一种策划, 避免重

(CZ深入浅出Java基础)设计模式笔记

一.面向对象思想设计原则 1.单一职责原则 其实就是开发人员经常说的"高内聚,低耦合",也就是说,每个类应该只有一个职责,对外只能提供一种功能,而引起类变化的原因应该只有一个.在设计模式中,所有的设计模式都遵循这一原则. 2.开闭原则 核心思想是:一个对象对扩展开放,对修改关闭.其实开闭原则的意思就是:对类的改动是通过增加代码进行的,而不是修改现有代码.也就是说软件开发人员一旦写出了可以运行的代码,就不应该去改动它,而是要保证它能一直运行下去,如何能够做到这一点呢?这就需要借助于抽象和

java 设计模式之单例模式

--------2015-11-20 14:45:10 java设计模式之单例模式(Singleton): ---应用场合:只需要一个对象就可以了,例如一个朝代一个皇帝. ---作用:保证某个应用程序中某个实例有且只有一个.共同使用一个,节省资源. ---类型:饿汉模式,懒汉模式. 一.饿汉模式(类加载的时候就会实例化,线程安全) 1 package com.sun.singleton; 2 3 //饿汉模式 4 public class Singleton { 5 6 //将构造函数私有化,不

跟我学设计模式视频教程——单例模式,建造者VS工厂方法

课程视频 单例模式 建造者VS工厂方法 课程笔记 课程笔记 课程代码 课程代码 新课程火热报名中 课程介绍 跟我学设计模式视频教程--单例模式,建造者VS工厂方法

Java设计模式:单例模式

概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例.在计算机系统中,线程池.缓存.日志对象.对话框.打印机.显卡的驱动程序对象常被设计成单例.这些应用都或多或少具有资源管理器的功能.每台计算机可以有若干个打印机,但只能

[转]JAVA设计模式之单例模式

原文地址:http://blog.csdn.net/jason0539/article/details/23297037 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例.在计算机系统中,线程池.缓存.日志对象.对话