单例模式

设计模式-单例模式

回眸只為那壹抹淺笑 提交于 2019-12-25 22:47:13
设计模式 设计模式分类 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 什么是单例 保证一个类只有一个实例,并且提供一个访问该全局访问点 单例应用场景 Windows的Task Manager(任务管理器)就是很典型的单例模式(这个很熟悉吧),想想看,是不是呢,你能打开两个windows task manager吗? 不信你自己试试看哦~ windows的Recycle Bin(回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例。 网站的计数器,一般也是采用单例模式实现,否则难以同步。 应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。 Web应用的配置对象的读取,一般也应用单例模式,这个是由于配置文件是共享的资源。 数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。数据库软件系统中使用数据库连接池,主要是节省打开或者关闭数据库连接所引起的效率损耗

Python 单例模式

那年仲夏 提交于 2019-12-25 20:29:26
使用场景: 1)在我们的windows桌面上,我们打开了一个回收站,当我们试图再次打开一个新的回收站时,Windows系统并不会为你弹出一个新的回收站窗口。,也就是说在整个系统运行的过程中,系统只维护一个回收站的实例。这就是一个典型的单例模式运用。 继续说回收站,我们在实际使用中并不存在需要同时打开两个回收站窗口的必要性。假如我每次创建回收站时都需要消耗大量的资源,而每个回收站之间资源是共享的,那么在没有必要多次重复创建该实例的情况下,创建了多个实例,这样做就会给系统造成不必要的负担,造成资源浪费。 2)网站的计数器,一般也是采用单例模式实现,如果你存在多个计数器,每一个用户的访问都刷新计数器的值,这样的话你的实计数的值是难以同步的。但是如果采用单例模式实现就不会存在这样的问题,而且还可以避免线程安全问题。同样多线程的线程池的设计一般也是采用单例模式,这是由于线程池需要方便对池中的线程进行控制 3)对于一些应用程序的日志应用,或者web开发中读取配置文件都适合使用单例模式,如HttpApplication 就是单例的典型应用。 4)发送短信时,多个用户创建实例,可以使用单例 从上述的例子中我们可以总结出适合使用单例模式的场景和优缺点: 适用场景: 1.需要生成唯一序列的环境 2.需要频繁实例化然后销毁的对象。 3.创建对象时耗时过多或者耗资源过多,但又经常用到的对象。 4

研磨设计模式之 单例模式-3

亡梦爱人 提交于 2019-12-25 18:26:02
3.3 延迟加载的思想 单例模式的懒汉式实现方式体现了延迟加载的思想,什么是延迟加载呢? 通俗点说,就是一开始不要加载资源或者数据,一直等,等到马上就要使用这个资源或者数据了,躲不过去了才加载,所以也称Lazy Load,不是懒惰啊,是“延迟加载”,这在实际开发中是一种很常见的思想,尽可能的节约资源。 体现在什么地方呢?看如下代码: 3.4 缓存的思想 单例模式的懒汉式实现还体现了缓存的思想,缓存也是实际开发中非常常见的功能。 简单讲就是,如果某些资源或者数据会被频繁的使用,而这些资源或数据存储在系统外部,比如数据库、硬盘文件等,那么每次操作这些数据的时候都从数据库或者硬盘上去获取,速度会很慢,会造成性能问题。 一个简单的解决方法就是:把这些数据缓存到内存里面,每次操作的时候,先到内存里面找,看有没有这些数据,如果有,那么就直接使用,如果没有那么就获取它,并设置到缓存中,下一次访问的时候就可以直接从内存中获取了。从而节省大量的时间,当然,缓存是一种典型的空间换时间的方案。 缓存在单例模式的实现中怎么体现的呢? 3.5 Java中缓存的基本实现 引申一下,看看在Java开发中的缓存的基本实现,在Java中最常见的一种实现缓存的方式就是使用Map,基本的步骤是: 先到缓存里面查找,看看是否存在需要使用的数据 如果没有找到,那么就创建一个满足要求的数据,然后把这个数据设置回到缓存中

设计模式之单例模式

烂漫一生 提交于 2019-12-24 19:15:39
什么是单例设计模式? 单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。 类结构图 具体实现 需要: (1)将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。 (2)在该类内部产生一个唯一的实例化对象,并且将其封装为private static类型。 (3)定义一个静态方法返回这个唯一对象。 实现一:立即加载 / “饿汉模式” 立即加载就是使用类的时候已经将对象创建完毕(不管以后会不会使用到该实例化对象,先创建了再说。很着急的样子,故又被称为“饿汉模式”),常见的实现办法就是直接new实例化。 public class Singleton { // 将自身实例化对象设置为一个属性,并用static、final修饰 private static final Singleton instance = new Singleton(); // 构造方法私有化 private Singleton() {} // 静态方法返回该实例 public static Singleton getInstance() { return instance; } } “饿汉模式”的优缺点: 优点:实现起来简单,没有多线程同步问题。 缺点

java设计模式--单例模式

こ雲淡風輕ζ 提交于 2019-12-24 18:07:02
单例设计模式 Singleton是一种创建型模式,指某个类采用Singleton模式,则在这个类被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点。 核心知识点如下: (1) 将采用单例设计模式的类的构造方法私有化(采用private修饰)。 (2) 在其内部产生该类的实例化对象,并将其封装成private static类型。 (3) 定义一个静态方法返回该类的实例。 /** * 方法一 * 单例模式的实现:饿汉式,线程安全 但效率比较低 */ public class SingletonTest { // 定义一个私有的构造方法 private SingletonTest() { } // 将自身的实例对象设置为一个属性,并加上Static和final修饰符 private static final SingletonTest instance = new SingletonTest(); // 静态方法返回该类的实例 public static SingletonTest getInstancei() { return instance; } } 方法一就是传说的中的饿汉模式 优点是:写起来比较简单,而且不存在多线程同步问题,避免了synchronized所造成的性能问题; 缺点是:当类SingletonTest被加载的时候,会初始化static的instance

Java 设计模式归纳(观察者、工厂、单例、策略、适配器、命令、装饰者、外观、模板方法、状态

此生再无相见时 提交于 2019-12-24 07:36:41
DesignPattern 项目地址: youlookwhat/DesignPattern 简介: Java 设计模式归纳 (观察者、工厂、单例、策略、适配器、命令、装饰者、外观、模板方法、状态). 更多: 作者 提 Bug 标签: 参照 Hongyang 的 CSDN 博客所写。如有错误欢迎指正,如有侵权,请联系我删除。 Java 设计模式(观察者模式、工厂模式、单例模式、策略模式、命令模式、装饰者模式、外观模式、模板方法模式、状态模式) 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。 设计模式分为三种类型,共 23 种: 创建型模式 : 单例模式 、抽象工厂模式、建造者模式、 工厂模式 、原型模式。 结构型模式 : 适配器模式 、桥接模式、 装饰模式 、组合模式、 外观模式 、享元模式、代理模式。 行为型模式 : 模版方法模式 、 命令模式 、迭代器模式、 观察者模式 、中介者模式、备忘录模式、解释器模式、 状态模式 、 策略模式 、职责链模式(责任链模式)、访问者模式。 Blog Catalogue: 1. 设计模式 观察者模式(Observer Pattern) 以微信公众服务为例 2. 设计模式 工厂模式(Factory Pattern) 从卖肉夹馍说起 3. 设计模式 单例设计模式(Singleton

Java设计模式-单例模式

有些话、适合烂在心里 提交于 2019-12-24 07:10:43
为什么要使用单例模式 实际开发中,为了节约系统资源,有时需要确保系统中某个类只有唯一的一个实例,当这个唯一实例创建成功后,就无法再创建一个同类型的其它对象,所有的操作都只能基于这个唯一实例。为了确保实例的唯一性,可以通过单例模式实现。 最简单的单例类设计 public class Single { // 设置instance为静态变量 private static Single instance = null; // 构造方法私有化 private Single() {} // 静态方法-实例化对象 public static Single getInstance() { if (instance == null) { // 实例化对象 instance = new Single(); } return instance; } public static void main(String[] args) { // 通过getInstance()方法获取实例 Single instance1 = Single.getInstance(); // 通过getInstance()方法获取实例 Single instance2 = Single.getInstance(); // 判断两个对象是否相同,相同则表示获取的是同一个实例,否则不是 System.out.println

单例中的懒汉和恶汉模式的区别

泄露秘密 提交于 2019-12-23 18:09:59
饿汉式 是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变; 懒汉式 如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的,推荐使用第一种 ; 从实现方式来讲他们最大的区别就是懒汉式是 延时加载 ,它是在需要的时候才创建对象; 而饿汉式在 虚拟机启动 的时候就会创建,饿汉式无需关注多线程问题、写法简单明了、能用则用。但是它是加载类时创建实例、所以如果是一个工厂模式、缓存了很多实例、那么就得考虑效率问题,因为这个类一加载则把所有实例不管用不用一块创建; 懒汉式的优点是延时加载、缺点是应该用同步(想改进的话现在还是不可能,比如double-check)、其实也可以不用同步、看你的需求了,多创建一两个无引用的废对象其实也没什么大不了; 来源: CSDN 作者: Splendid 、 链接: https://blog.csdn.net/Tang_cancan/article/details/103663510

并发之懒汉饿汉的单例模式线程安全问题

情到浓时终转凉″ 提交于 2019-12-22 21:41:21
饿汉模式: 本身线程安全,在类加载时就已经进行了实例化,无论之后用不用的到。 package com . cljtest . demo . thread ; public class HungerSingleton { public static HungerSingleton hungerSingleton = new HungerSingleton ( ) ; public static HungerSingleton getInstance ( ) { return hungerSingleton ; } //构造方法私有化 private HungerSingleton ( ) { } public static void main ( String [ ] args ) { //起10个线程进行结果测试 for ( int i = 0 ; i < 10 ; i ++ ) { new Thread ( ( ) - > { System . out . println ( HungerSingleton . getInstance ( ) ) ; } ) . start ( ) ; } } } 一定要注意无参构造方法的私有化问题,如果 设成了public,其他类里实例化时直接new一个无参的构造方法,会造成单例模式失去意义。 由于类加载时就已经实例化了

设计模式 创建型---单例模式

好久不见. 提交于 2019-12-22 20:48:50
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 单例模式作为设计模式中做常见的一种,这里代码也不重复了。 单例模式有9种实现方式,但是其中部分是有缺陷的。总结下来就是四种: 一、饿汉模式 /** * @ClassName: Singleton2 * @description: 单例模式---饿汉模式(线程安全,但是不节省资源) * @author: edison_Kwok * @Date: create in 2019/12/10 22:59 * @Version: 1.0 */ public class Singleton2 { private static Singleton2 uniqueSingleton2 = new Singleton2(); private Singleton2() { } public static Singleton2 getUniqueSingleton2() { //线程不安全问题主要是由于 uniqueInstance 被实例化多次,采取直接实例化 uniqueInstance 的方式就不会产生线程不安全问题。 //但是直接实例化的方式也丢失了延迟实例化带来的节约资源的好处。 return uniqueSingleton2; } } 二、双重校验的懒汉模式 /** * @ClassName: Singleton4 *