软件设计模式之单例模式

什么是单例模式?

单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

单例模式的特点:

1、单例类有且只能有一个实例。

2、单例类需要自己创建一个自己的实例。

3、单例类需要为其他类提供这个实例。

哪些地方经常用到单例?

在计算机系统中,配置文件,线程池,缓存,日志对象,打印机等经常用到单例模式

所谓“一山不容二虎”,如果出现二虎很容易会出问题,比如配置文件,它终究只是一个文件,如果同时有好几个实例访问它并执行修改操作,那么这时候就会引发出一系列的问题

单例相对于多实例对象也更节约系统资源

单例模式常用的有几种模式?

一般来讲单例模式有三种,分别是:懒汉式,饿汉式,登记式。

下面直接上代码说明吧

①一个类之所以能够创建出实例是因为有构造方法的存在,只要我们把构造方法的访问修饰符改成私有(private),外界就不能通过new来创建该类的实例。

②在单例类中自身new出一个对象,因为要被外界访问,我们可以把它静态化(static),以便外界访问(类型.对象)。

③有时候我们需要控制这个对象,也处于安全起见,我们可以把继续私有化(private),然后提供一个getter方法以便外界访问。

SimpletonDemo1.java(单例类)

 1 package com.lcw.simpleton;
 2
 3 public class SimpletonDemo1 {
 4     //将构造方法私有化,阻止外界直接创建对象
 5     private SimpletonDemo1() {
 6     }
 7     //提供static以便外界访问
 8     private static SimpletonDemo1 instance = new SimpletonDemo1();
 9
10     //提供getter方法以便外界访问私有化对象,static SimpleDemo1返回类型
11     public static SimpletonDemo1 getInstance() {
12         return instance;
13     }
14 }

SimpletonTest.java(测试类)

 1 package com.lcw.simpleton;
 2
 3 public class SimpletonTest {
 4     public static void main(String[] args) {
 5         SimpletonDemo1 s1=SimpletonDemo1.getInstance();
 6         SimpletonDemo1 s2=SimpletonDemo1.getInstance();
 7
 8         if(s1==s2){//检测对象的内存地址是否一致
 9             System.out.println("s1和s2是同个对象");
10         }else{
11             System.out.println("s1和s2不是同个对象");
12         }
13
14     }
15 }

效果如下:

上面所说的就是单例模式里饿汉模式,为什么叫饿汉模式呢?

由于这个实例是被static所修饰,被static修饰的成员属于类所有,当类加载的时候,这个成员就被加载了,也就是说不管外界是否调用这个类,它都已经被加载了。

看起来好像是饿汉,不管三七二十一,先吃了你再说。

下面再来看下单例模式中的懒汉模式

就字面上的意思,其实已经很明白了“懒汉模式”,顾名思义不同于饿汉模式,既然饿汉模式是不管三七二十一先吃了再说,那么懒汉模式当然就没那么勤快了,应该是被我们调用后的时候才去实例化对象。

它们的写法很类似,只不过是在用private static声明对象的时候不直接new对象,而是在gette方法里再去实例化对象

然后判断下这个对象是否为null,如果为null则实例化一个对象,如果不会空则直接返回对象。

下面看下具体代码

SimpletonDemo2.java(单例类)

 1 package com.lcw.simpleton;
 2
 3 public class SimpletonDemo2 {
 4     //将构造方法私有化,阻止外界直接创建对象
 5     private SimpletonDemo2() {
 6     }
 7     //提供static以便外界访问
 8     private static SimpletonDemo2 instance = new SimpletonDemo2();
 9
10     //提供getter方法以便外界访问私有化对象,static SimpleDemo1返回类型
11     public static SimpletonDemo2 getInstance() {
12         return instance;
13     }
14 }

SimpletonTest.java(测试类)

 1 package com.lcw.simpleton;
 2
 3 public class SimpletonTest {
 4     public static void main(String[] args) {
 5         SimpletonDemo1 s1=SimpletonDemo1.getInstance();
 6         SimpletonDemo1 s2=SimpletonDemo1.getInstance();
 7
 8         if(s1==s2){//检测对象的内存地址是否一致
 9             System.out.println("s1和s2是同个对象");
10         }else{
11             System.out.println("s1和s2不是同个对象");
12         }
13
14
15         SimpletonDemo2 s3=SimpletonDemo2.getInstance();
16         SimpletonDemo2 s4=SimpletonDemo2.getInstance();
17
18         if(s3==s4){//检测对象的内存地址是否一致
19             System.out.println("s3和s4是同个对象");
20         }else{
21             System.out.println("s3和s4不是同个对象");
22         }
23
24     }
25 }

效果如下:

总结下两种模式的区别:

1、饿汉模式,在加载类的时候比较慢,由于它还要去实例化一个对象,但在运行调用中的速度会比较快。

2、懒汉模式,在加载类的时候比较快,由于在加载类的时候不需要去实例化对象,但在运行调用时的速度比较慢,由于还要去做判断。

还有一点很重要的是,饿汉模式是属于线程安全,而懒汉模式属于线程不安全。

时间: 2024-08-13 23:33:45

软件设计模式之单例模式的相关文章

PHP设计模式之单例模式

一.什么是单例模式 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例.即一个类只有一个对象实例 单例模式的应用场景 通常用来数据库连接,日志写入等方面,为了减少资源浪费,减少数据库连接次数,节约资源,提高效率. 三.如何实现 要实现单例模式其实挺简单的,总结起来就一句话:三私一公,四个步骤: 1.私有化构造方法 2.声明一个公开的静态方法用来创建实例 3.声明一个私有的静态变量用来存储第二步创建的实例 4.私有化克隆方法

作业06之《软件设计模式》

我们在上个学期的课上已经学过了设计模式,但是都是在系统学习的基础上去认识软件设计模式的.所以后来在网上查了很多资料增加了很多自己的认识. 模式的含义其实就是对前人经验的总结,设计模式初期也是起源于建筑领域,它的目的就是为后人设计与开发基于面向对象的软件提供指导方针和成熟的解决方案,可以被认为是对软件开发这一问题的解法的某种统一表示,是在一定条件下出现的问题以及解法. 设计模式有一个定义:设计模式是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结,使用设计模式是为了可重用代码.让代

简述23种软件设计模式

简述23种软件设计模式 一.设计模式分类 总体来说设计模式分为三大类: 五种创建型模式:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 七种结构型模式:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 十一种行为型模式:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 二.设计模式概述 创建型模式 1.工厂方法模式 工厂方法模式的创建是因为简单工厂模式有一个问题,在简单工厂模式

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

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

Android设计模式之单例模式

定义 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例 . 单例模式是设计模式中最简单的形式之一.这一模式的目的是使得类的一个对象成为系统中的唯一实例.要实现这一点,可以从客户端对其进行实例化开始.因此需 要用一种只允许生成对象类的唯一实例的机制,"阻止"所有想要生成对象的访问.使用工厂方法来限制实例化过程.这个方法应该是静态方法(类方法),因为让 类的实例去生成另一个唯一实例毫无意义. 其又分为三种形式 饿汉

软件设计模式

软件设计模式大致能够分为三类.共23种. 创建型模式:单例模式,抽象工厂模式.建造者模式,工厂模式.原型模式. 结构型模式:适配器模式,桥接模式,装饰模式.组合模式,外观模式,享元模式.代理模式. 行为型模式:模板方法模式,命令模式.迭代器模式,观察者模式,中介者模式,备忘录模式,解释器模式.状态模式,策略模式,责任链模式.訪问者模式. 经常使用的有:装饰模式.代理模式,适配器模式,观察者模式.策略模式.模板模式,工厂模式.

文成小盆友python-num8 面向对象中的成员,成员修饰符,特殊成员,异常处理,设计模式之单例模式

本节主要内容: 1.面向对象中的成员 2.成员修饰符 3.特殊成员 4.异常处理 5.设计模式之单例模式 一.面向对象中的成员(类的成员) 类的成员总共可以分为3大类,每类中有不同的分支. 1.总述,基本分类 如下图所示: 类成员包括字段,方法,和属性 2.字段 如上图字段分为普通字段和静态字段,两者的使用有区别,但是最大的区别在于两者在内存中的保存位置有区别. 普通字段属于对象而静态字段属于类,在使用过程中谁的字段就由谁来调用. 静态字段和普通字段的定义如下: 在调用时分各自调用 #####类

Java软件设计模式------单例设计模式

Java软件设计模式一共分为23种; 一般常用的有: 单例设计模式 装饰设计模式 工厂设计模式 单例设计模式(以后的用处:spring框架IOC,默认创建的对象都是单例的): 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源.如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案. 单例设计模式分为两种(饿汉式和懒汉式): ①饿汉式(常用): 特

设计模式之单例模式——Singleton

                    设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有公开的调用方法.而且,别的类不能实例化它,所以构造方法要设置为私有的. 单例模式的要点 一是某个类只能有一个实例: 二是它必须自行创建这个实例: 三是它必须自行向整个系统提供这个实例. 例如: 有一个"单例对象",而"客户甲"."客户乙" 和&quo