设计模式总结篇系列:单例模式(SingleTon)

在Java设计模式中,单例模式相对来说算是比较简单的一种构建模式。适用的场景在于:对于定义的一个类,在整个应用程序执行期间只有唯一的一个实例对象。如Android中常见的Application对象。

通过单例模式,自行实例化并向这个系统提供这个单一实例的访问方法。

根据此单一实例产生的时机不同(当然,都是指第一次,也是唯一一次产生此单一实例时),可以将其分为懒汉式、饿汉式和登记式。

一、懒汉式:

其特点是延迟加载,即当需要用到此单一实例的时候,才去初始化此单一实例。常见经典的写法如下:


 1 package com.qqyumidi;
2
3 public class SingleTon {
4
5 // 静态实例变量
6 private static SingleTon instance;
7
8 // 私有化构造函数
9 private SingleTon() {
10
11 }
12
13 // 静态public方法,向整个应用提供单例获取方式
14 public static SingleTon getInstance() {
15 if (instance == null) {
16 instance = new SingleTon();
17 }
18 return instance;
19 }
20
21 }

二、饿汉式:

饿汉式的特点是应用中尚未需要用到此单一实例的时候即先实例化。常见的经典写法为:


 1 package com.qqyumidi;
2
3 public class SingleTon {
4
5 // 静态实例变量,直接初始化
6 private static SingleTon instance = new SingleTon();
7
8 // 私有化构造函数
9 private SingleTon() {
10
11 }
12
13 // 静态public方法,向整个应用提供单例获取方式
14 public static SingleTon getInstance() {
15 return instance;
16 }
17
18 }

三、登记式单例模式:

登记式单例模式,一般是通过一个专门的类对各单例模式的此单一实例进行管理和维护。通过Map方式可以方便的实现此中目的。常见的代码如下:


 1 package com.qqyumidi;
2
3 import java.util.HashMap;
4 import java.util.Map;
5
6 public class SingleTonManager {
7
8 private static Map singleTonMap = new HashMap();
9
10 public static void main(String[] args) {
11 // 获取A类的单例
12 A a = (A) getInstance(A.class.getName());
13 // 获取B类的单例
14 B b = (B) getInstance(B.class.getName());
15 }
16
17 // 根据类型获取单例
18 public static Object getInstance(String className) {
19 // 判断singleTonMap中是否有此单例,有则取得后返回,无则添加单例后返回
20 if (!singleTonMap.containsKey(className)) {
21 try {
22 singleTonMap.put(className, Class.forName(className).newInstance());
23 } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
24 // TODO Auto-generated catch block
25 e.printStackTrace();
26 }
27 }
28 return singleTonMap.get(className);
29 }
30 }
31
32 class A {
33
34 }
35
36 class B {
37
38 }

另外:需要注意的是,在多线程环境中,以上各种方法构造单例模式需要考虑到线程安全问题。

四、改进型懒汉式(直接满足线程安全)——通过静态内部类实现

在如上的懒汉单例模式中,对于多线程环境中。可以通过常见的如synchronized等方式实现线程安全,同时,可以通过Java静态内部类的方式实现进一步改进。

常见代码如下:


 1 package com.qqyumidi;
2
3 public class SingleTon {
4
5 // 利用静态内部类特性实现外部类的单例
6 private static class SingleTonBuilder {
7 private static SingleTon singleTon = new SingleTon();
8 }
9
10 // 私有化构造函数
11 private SingleTon() {
12
13 }
14
15 public static SingleTon getInstance() {
16 return SingleTonBuilder.singleTon;
17 }
18
19 public static void main(String[] args) {
20 SingleTon instance = getInstance();
21 }
22 }

其主要原理为:Java中静态内部类可以访问其外部类的成员属性和方法,同时,静态内部类只有当被调用的时候才开始首次被加载,利用此特性,可以实现懒汉式,在静态内部类中静态初始化外部类的单一实例即可。

设计模式总结篇系列:单例模式(SingleTon),布布扣,bubuko.com

时间: 2024-10-12 02:10:26

设计模式总结篇系列:单例模式(SingleTon)的相关文章

设计模式总结篇系列:策略模式(Strategy)

前面的博文中分别介绍了Java设计模式中的创建型模式和结构型模式.从本文开始,将分别介绍设计模式中的第三大类,行为型模式.首先我们了解下分为此三大类的依据. 创建型模式:主要侧重于对象的创建过程: 结构型模式:主要侧重于处理类或对象的组合: 行为型模式:主要侧重于类或对象之间的交互以及职责分配. 首先了解下策略模式的概念:定义了多个算法,并将它们封装起来(一般的是每个算法封装成一个单独的类),让算法独立于客户端而可以单独变化. 具体可以看一下下面的例子(以计算加.减.乘为例): 1. 对加.减.

设计模式总结篇系列:外观模式(Facade)

张三自从毕业后开始做软件开发,做着做着发现不爽了,钱赚不了太多,头发也白了.于是拿着一点小资本,想着做点小生意.瞅着眼前的餐饮行业还不错,于是打算开一家餐馆.开参观可不是一件容易的事,仅仅行政类的审批流程就不少.至少包括办理卫生许可证,办理税务登记,办理工商登记等. 我们先来看一下行政审批接口: 1 interface Executive{ 2 3 public void approve(); 4 5 } 卫生局类的定义: 1 class HealthOffice implements Exec

设计模式总结篇系列:代理模式(Proxy)

时代在发展,我们发现,现在不少明星都开始进行微访谈之类的,有越来越多的参与捐赠等.新的一天开始了,首先看下新的一天的日程安排: 1 interface Schedule{ 2 3 public void weiTalk(); 4 5 public void donation(); 6 7 } Schedule接口定义了今天的形成安排,主要包括微访谈和捐款.那么看一下实现此接口的明星类定义: 1 class Star implements Schedule { 2 3 @Override 4 pu

设计模式总结篇系列:组合模式(Composite)

在探讨Java组合模式之前,先要明白几个概念的区别:继承.组合和聚合. 继承是is-a的关系.组合和聚合有点像,有些书上没有作区分,都称之为has-a,有些书上对其进行了较为严格区分,组合是contains-a关系,聚合是has-a关系. 组合方式中被组合的对象生命周期不能超过整体,一般写代码时是直接在整体类的构造方法中创建被组合类的对象.如人和手之间的关系,人都没了,还何来手? 聚合方式中对于对象的生命周期则没有此类限制,一般可以在聚合类的构造函数中通过外部传参以赋值给整体(或通过其他set等

设计模式总结篇系列:桥接模式(Bridge)

在实际类设计过程中,有时会遇到此类情况:由于实际的需要,某个类具有两个或两个以上的维度变化,如果利用继承将每种可能的变化情况都定义成一个类,一是会导致类膨胀的问题,二是以后不太好维护和并且违背类的设计原则.那么面对这种情况,类改如何设计呢?这就是本文所要讲到的桥接模式. 简单的讲,桥接模式是指:将抽象和行为划分开来,从而将各个可能变化的维度分离开来,各自独立成一个类,但是能够动态的组合. 貌似有点抽象,下面通过一个简单的例子来理解桥接模式. 我们可以通过Email发送信息,也可以手段短信发送信息

设计模式总结篇系列:建造者模式(Builder)

关于建造者模式网上有很多文章,也有些不同的理解.在此结合网上其他文章对建造者模式进行总结. 总体说来,建造者模式适合于一个具有较多的零件(属性)的产品(对象)的创建过程.根据产品创建过程中零件的构造是否具有一致的先后顺序,可以将其分为如下两种形式. 一.通过Client.Director.Builder和Product形成的建造者模式 Builder负责Product类对象的具体过程构建,Director负责指导Build,要求Builder按照其指定的顺序去完成Produt的构造.最后通过Bu

设计模式总结篇系列:工厂方法模式(Factory Method)

工厂方法模式适合于对实现了同一接口或继承了同一父类的一些类进行实例的创建.一般是通过定义一个工厂类,并在其方法中实现对具有上述特点的类对象的创建. 根据具体产生类对象的方法定义形式,又可以将其分为普通工厂方法模式.多个工厂方法模式和静态工厂方法模式. 一.普通工厂方法模式: 常见的经典写法如下(以发送邮件和短信为例): 1.定义邮件类和短信类具有的共同接口: 1 interface Sender{ 2 3 public void sender(); 4 5 } 2.定义邮件类和短信类: 1 cl

设计模式总结篇系列:适配器模式(Adapter)

网上看到不少关于适配器模式的讲解,其中对于适配器模式解释的过于专业,一时不是特别理解适配器模式到底是用来干嘛的,具体的适用场景在哪,其最精髓的地方到底在哪. 本文结合自己的理解,阐述下对适配器模式的看法. 假设系统存在一个现有的类UserInfo: 1 class UserInfo { 2 3 private Map<String, String> userBaseInfo; 4 5 public Map getUserBaseInfo() { 6 return userBaseInfo; 7

Java设计模式偷跑系列(六)Singleton模式的建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39784403 单例模式(Singleton):是一种经常使用的设计模式. 在Java应用中.单例对象能保证在一个JVM中.该对象仅仅有一个实例存在. 优点主要有:1.某些类创建比較频繁,对于一些大型的对象,这是一笔非常大的系统开销. 2.省去了new操作符,减少了系统内存的使用频率,减轻GC压力. 单例模式主要有两种实现方式:1.懒汉式.2.饿汉式 一.uml建模 二.代码实现: 1.懒