【设计模式】单例模式学习

一:必要性

无论是在软件还是系统中,有时我们只需要某个东西出现一次,记得老师上课时提到的任务管理器,就是最典型的一个例子,任务管理器能告诉用户现在计算机里正在运行的程序的信息,试想一下如果能打开两个任务管理器,那么同步又是个大问题,虽然这个问题就不是个问题,没人愿意不明不白的看到两个任务管理器,如果有不同也不是用户的关注重点。而在记忆中,早期的windows就能打开很多任务管理器,现在想想这样是不太合理的。就算他们达成了同步一致的要求,那又有什么意义呢,都一样的东西,不过是浪费系统资源罢了。所以如何让一个类只有一个实例是很重要的

二:定义

Ensure a class has a only one instance,and provide a globe point of access to it.即:确保一个类只有一个实例并且它自己能实例化自己并向整个系统提供这个实例。

三:实现方法

在java中有两种实现方式,分别是懒汉式和饿汉式。

1:饿汉式:顾名思义。说明人很饿,立马就要吃东西,

public class Singleton1 {
    // 私有构造
    private Singleton1() {}

    private static Singleton1 single = new Singleton1();

    // 静态工厂方法
    public static Singleton1 getInstance() {
        return single;
    }
}

构造方法为private,保证不能在类外实例化。直接创建好一个静态私有的单例实例对象,类外只能通过静态getinstance()获得唯一的实例对象。

2:懒汉式:不是很饿,饿的时候再创建。

 1 public class Singleton2 {
 2
 3     // 私有构造
 4     private Singleton2() {}
 5
 6     private static Singleton2 single = null;
 7
 8     public static Singleton2 getInstance() {
 9         if(single == null){
10             single = new Singleton2();
11         }
12         return single;
13     }
14 }

同样私有构造方法保证不能在类外实例化。先不创建实例对象,赋值为null,只有调用getinstance()时才判断一下是不是有实例,如果没有则创建,有则直接返回实例。

四:并发问题

懒汉式加载在单线程时是没问题的,但当多线程并发时则会出现线程安全问题,原因是两个线程一起来都判断有没有实例,甚至是其中一个已经开始创建对象了,但对象初始化需要时间,这时另一个会判断没有实例,导致最后两个线程都创建了实例,单例失败!

解决方法:1:给getinstance加synchronized(效率低)   2:double-check,先判断有没有实例,如果没有则将方法加锁,如果有则直接返回实例,这样不用每次都执行同步快代码  3:用饿汉式加载

五:单例模式的优缺点

优点:1,防止资源浪费  2,减少性能开销  3,避免对资源的多重占用(指的是自己占用别人,不是自己占用)  4,设置访问点,优化共享资源的访问

缺点:1,一般没有接口,扩展困难,因为要自行实例,所以如果作为接口就不能被实例化了  2,对测试不利,如果单例模式未完成不能测试  3,与单一职责原理相悖,类应该只关心自己的事,而不是是否单例等其他业务逻辑。

原文地址:https://www.cnblogs.com/BlakeHair/p/10470306.html

时间: 2024-08-06 03:44:32

【设计模式】单例模式学习的相关文章

设计模式——单例模式学习

单例模式属于设计模式中的创建模式,即创建对象时,不再由我们直接实例化对象,而是根据特定场景,由程序来确定创建对象的方式,从而保证更大的性能.更好的架构优势. 1.概念 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例.选择单例模式就是为了避免不一致状态.使用Singleton的好处还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收(garbage collection). Singleton模式看起来简单,使用方法也很方便,但是真正用好,是非常不容易,需要对

设计模式--单例模式(学习笔记)

定义:      单例模式:保证一个类只有一个实例,并且提供一个访问它的全局访问点.(<大话设计模式定义>): 单例模式分为两种: 1>饿汉式单例类:自己被加载时就将自己实例化. 例子:       private SingleExample() {           } private static SingleExample singleExample=new SingleExample(); @Override protected SingleExample getInstanc

【大话设计模式】设计模式系统学习大合集

转载请注明出处:http://blog.csdn.net/column/details/designpatternbylmb.html 为了方便各位网友学习以及方便自己复习之用,将设计模式的系列内容按照由浅入深的学习顺序总结如下,点击相应的标题即可跳转到对应的文章. 大话设计模式-工厂模式 大话设计模式-单例模式 大话设计模式-原型模式 深复制VS浅复制(MemberwiseClone方法介绍) 大话设计模式-代理模式 大话设计模式-中介者模式 大话设计模式-策略模式 大话设计模式-装饰模式 大

黑马程序员之单例模式学习

android培训  java培训 期待与您交流! java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种. 单例模式有一下特点: 1.单例类只能有一个实例. 2.单例类必须自己自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例.在计算机系统中,线程池.缓存.日志对象.对话框.打印机.显卡的驱动程序对象常被设计成单例.这些应用都或多或少具有资源管理器的功能.每台计算机

最简单的设计模式——单例模式的演进和推荐写法(Java 版)

前言 如下是之前总结的 C++ 版的:软件开发常用设计模式—单例模式总结(c++版),对比发现 Java 实现的单例模式和 C++ 的在线程安全上还是有些区别的. 概念不多说,没意思,我自己总结就是: 有这样一个类,该类在生命周期内有且只能有一个实例,该类必须自己创建自己的这个唯一实例,该类必须给所有其他对象提供这一实例(提供全局访问点),这样的类就叫单例类. 简单的说就是满足三个条件: 1.生命周期内有且只能有一个实例 2.自己提供这个独一无二的实例 3.该实例必须是能全局访问的 需要的考虑的

jdk 中Runtime之单例模式 学习

这段代码是我从源码中截取的,大家很容易看到currentRuntime是一个静态变量,getRunTime对应的就是getInstacne.不是说这种方法不好吗? 1 public class Runtime { 2 45 private static Runtime currentRuntime = new Runtime(); 3 4 5 Returns the runtime object associated with the current Java application. Most

php设计模式——单例模式(Singleton)

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 谷歌的Android设备 华为的Android设备 IOS只属于苹果公司 IOS只属于苹果公司 1 <?php 2 3 /* 4 * php

《Head First 设计模式》学习笔记——适配器模式 + 外观模式

在ADO.NET中,对于我们从数据库中取出的数据都要放到一个DataSet中,不管你是Access的数据库,还是SQL的数据库,或者是Oracle的数据库都要放到DataSet中..NET中并没有提供如:SqlDataSet.OleDbDataSet.OracleDataSet等,它只提供了一种DataSet就是用SqlDataAdapte等去填充数据:为什么这一个DataSet能存放不同的数据呢?就是有这些适配器来适配.----题记 设计模式 适配器模式:将一个类的接口,转换成客户期待的另一个

《Head First 设计模式》学习笔记——模板方法模式

模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现.这就是模板方法模式的用意. 设计模式 模板方法模式:在一个方法中定义一个算法的框架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结果的情况下,重新定义算法中的某些步骤. 模板就是一个方法,这个方法将算法定义成一组步骤,其中的任何步骤都可以是抽象的,由子类负责实现.这样可以确

浅谈设计模式的学习(下)

时间过得真快啊,不知不觉又要周末了,借这个周末时间.把<浅谈设计模式的学习(下)>补上吧. 在<浅谈设计模式的学习(中)>中,说到了保持抽象的思维.接下来说一下第四点,做一个分享,也记录一下自己的学习历程. 4.学习设计模式,就不要把它看的太认真    设计模式是一个编程思想,它不是具体的代码套路.举个例子说明一下: 由于家传,接触到了一些中国的传统武术.当我与那些不懂传统武术的人交流的时候,他们总是认为中国的传统武术都是些套路.花架子,只是用来好看.在他们认为,两人打架,别人出拳