单例模式

在面试通过通过单例模式来展示实例

不羁岁月 提交于 2020-02-09 10:46:54
在面试初级和高级开发时,一般会问设计模式的问题。通常会让写下单例模式的实现方法,或者让结合项目,说下用过的设计模式,在本文里,就将讲述单例模式的多种写法,以此告诉大家如何在面试中展示实力。 如果在项目里,多个运行实例都会从同一个配置文件里读取发送邮件的列表,那么我们就可以用单例模式来创建这个读配置文件的类。我们先来看下单线程情况下单例模式的写法。 1 public class MailListReader { 2 private static MailListReader reader = null; 3 private MailListReader(){}//构造函数私有 4 //向外部开放一个公有的静态函数来提供对象 5 public static MailListReader getInstance() { 6 if(reader == null) 7 reader = new MailListReader(); 8 return reader; 9 } 10 //提供邮件列表的方法 11 List<String> provideList() 12 { 省略提供邮件列表的代码 } 13 } 在上述的代码里,我们可以看到实现单例模式的两大要素,第一,第3行提供的构造函数是私有的,这样外部代码就无法通过调用构造函数来创建MailListReader对象。第二

设计模式之单例模式

你离开我真会死。 提交于 2020-02-08 05:50:36
单例模式 在有些系统中,为了节省内存资源、保证数据内容的一致性,对某些类要求只能创建一个实例,这就是所谓的单例模式。 单例模式的定义与特点 单例模式(Singleton Pattern)的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。 单例模式有 3 个特点: 1.单例类只有一个实例对象; 2.该单例对象必须由单例类自行创建; 3.单例类对外提供一个访问该单例的全局访问点; 优点: 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例。 2、避免对资源的多重占用(比如写文件操作)。 缺点: 没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。 单例模式的结构与实现 单例模式是 设计模式 中最简单的模式之一。通常,普通类的构造函数是公有的,外部类可以通过“new 构造函数()”来生成多个实例。但是,如果将类的构造函数设为私有的,外部类就无法调用该构造函数,也就无法生成多个实例。这时该类自身必须定义一个静态私有实例,并向外提供一个静态的公有函数用于创建或获取该静态私有实例。 下面来分析其基本结构和实现方法。 1. 单例模式的结构 单例模式的主要角色如下。 单例类:包含一个实例且能自行创建这个实例的类。 访问类:使用单例的类。 其结构如图 1 所示。                     图1

设计模式 - 单例模式

萝らか妹 提交于 2020-02-08 05:01:10
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 注意: 单例类只能有一个实例。 单例类必须自己创建自己的唯一实例。 单例类必须给所有其他对象提供这一实例。 介绍 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。 主要解决:一个全局使用的类频繁地创建与销毁。 何时使用:当您想控制实例数目,节省系统资源的时候。 如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。 关键代码:构造函数是私有的。 应用实例: 一个班级只有一个班主任。 Windows 是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。 一些设备管理器常常设计为单例模式,比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件。 优点: 在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。 避免对资源的多重占用(比如写文件操作)。 缺点:没有接口,不能继承,与单一职责原则冲突

设计模式 - 单例模式

半世苍凉 提交于 2020-02-08 04:08:07
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 注意: 1、单例类只能有一个实例。 2、单例类必须自己创建自己的唯一实例。 3、单例类必须给所有其他对象提供这一实例。 介绍 意图: 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 主要解决: 一个全局使用的类频繁地创建与销毁。 何时使用: 当您想控制实例数目,节省系统资源的时候。 如何解决: 判断系统是否已经有这个单例,如果有则返回,如果没有则创建。 关键代码: 构造函数是私有的。 应用实例: 1、一个党只能有一个主席。 2、Windows 是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。 3、一些设备管理器常常设计为单例模式,比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件。 优点: 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。 2、避免对资源的多重占用(比如写文件操作)。 缺点: 没有接口

Java 基础:单例模式 Singleton Pattern

强颜欢笑 提交于 2020-02-08 03:39:25
1.简介 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 注意: 1、单例类只能有一个实例。 2、单例类必须自己创建自己的唯一实例。 3、单例类必须给所有其他对象提供这一实例。 意图: 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 主要解决: 一个全局使用的类频繁地创建与销毁。 何时使用: 当您想控制实例数目,节省系统资源的时候。 如何解决: 判断系统是否已经有这个单例,如果有则返回,如果没有则创建。 关键代码: 构造函数是私有的。 2.单例模式的几种实现方式 单例模式的实现有多种方式,如下所示: 2.1.懒汉式,线程不安全 是否 Lazy 初始化: 是 是否多线程安全: 否 实现难度: 易 描述: 这种方式是最基本的实现方式,这种实现最大的问题就是不支持多线程。因为没有加锁 synchronized,所以严格意义上它并不算单例模式。 这种方式 lazy loading 很明显,不要求线程安全,在多线程不能正常工作。 public class Singleton { private static

设计模式&单例模式

寵の児 提交于 2020-02-08 02:08:56
一、首篇自序 第一次整理博客,会稍微啰嗦讲几句,希望大家不要喷我^_^^_^,初来乍到不是很有经验。 今天开始陆续会尽我一切的能力写一系列关于java文章内容,要是哪里做的不好,还希望大家多多指教。 我会接受大家的意见,不断进步。 当然也希望我的文章能够帮助到大家,哪怕是一点点也好。 尤其是java需要循序渐进的去学习,去进步,一口吃成胖子是很难。 如果在坐的大家有想学习java,或者正在初学java的小伙伴,请不要着急。 个人觉得要学好java最好的方式就是:首先要舍得付出,其次每天要求自己学习2小时计划,再就是要合理的回顾以及练习。 这样坚持下去,走好每一天,不要烦躁这个想学那个想学。最后时间走了,学到的东西都是半斤八两。 当然这只是我个人的意见,大家有什么好的学习建议也可以分享分享。 最后废话不多说了,今天开始给大家总结一下设计模式中的《单例模式》。 后续的博客规划:设计模式、并发编程、Spring核心原理、Mybatis源码分析、IO/Netty、SpringBoot、SpringCloud、Apache Dubbo、Zookeeper、Nacos、Sentinel,kafka原理分析、RabbitMQ原理分析、RocketMQ原理分析、docker、k8s 。。。。。。 二、单例设计模式讲解内容(由于最近工作也是比较饱和时间有限,后续会将文章相关源码托管到git上

设计模式之单例模式

為{幸葍}努か 提交于 2020-02-08 02:00:15
一、介绍   单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 TIPS: 1、单例类只能有一个实例。 2、单例类必须自己创建自己的唯一实例。 3、单例类必须给所有其他对象提供这一实例。 实现的目标:保证一个类仅有一个实例,并提供一个访问它的全局访问点。 解决得问题:一个全局使用的类频繁地创建与销毁。 核心思想:构造函数是私有的。并且对外提供一个全局的访问方法。 使用场景:  1、要求生产唯一序列号。 2、代码级别的全局的JVM缓存。(有状态的单例) 3、创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。 二、懒汉式   所谓的懒汉式单例,是指:第一次调用才初始化,避免内存浪费。典型的时间换取空间的做法。因为第一次获取单例的时候会执行单例的实例化,浪费一些时间。但是后面再继续获取就不存时间问题了。 2.1、懒汉式的简化版 1 package com.shf.mode.singleton; 2 3 /** 4 * 描述:懒汉式 5 * 单例实例在第一次调用的时候创建 6 * 典型的以时间换取空间,第一次调用

详谈单例、饿汉、和懒汉模式

别等时光非礼了梦想. 提交于 2020-02-07 18:26:19
一、基本概念 单例模式属于创建型设计模式。 确保一个类只有一个实例,并提供该实例的全局访问点。 实现: 使用一个私有构造函数、一个私有静态变量以及一个公有静态函数来实现。 二、结构 类图: 私有构造函数保证了不能通过构造函数来创建对象实例,只能通过公有静态函数返回唯一的私有静态变量。 三、几类经典单例模式实现 1、懒汉式-线程不安全 下面的实现中,私有静态变量 uniqueInstance 被延迟实例化,这样做的好处是,如果没有用到该类,那么就不会实例化 uniqueInstance ,从而节约资源。 这个实现在多线程环境下是不安全的,如果多个线程能够同时进入 if (uniqueInstance == null) ,并且此时 uniqueInstance == null ,那么会有多个线程执行 uniqueInstance = new Singleton(); 语句,这将导致实例化多次 uniqueInstance 。 // 懒汉式: 线程不安全 // 有延迟加载: 不是在类加载的时候就创建了,而是在调用newStance()的时候才会创建 public class Singleton { private static Singleton uniqueInstance; private Singleton(){ } public static Singleton

单例模式与静态类

岁酱吖の 提交于 2020-02-07 18:22:27
单例模式:是一种常用的创建对象的方式,比起普通方式创建对象,这种思想具有非常多的优点。是 java 23种设计模式之一。 构造器被私有化,类中对外提供唯一对象,常见的有懒汉式和饿汉式等。 懒汉式:调用时创建一个对象,后续调用不再重新创建。 饿汉式:类加载时就创建了,并且只创建一次。 静态类(常见的工具类都是):所有的成员都是静态的。可以认为是静态的集合。 例如: Math类是一个静态类。 我们使用 Math.round()方法时,并不关注Math类本身,关注的其实是round方法的方法体中的代码执行逻辑。 使用工具类,其实是使用了工具类中方法的方法体。与类对象无关。 所以单例模式与静态类的区别在于: 单例模式是面向对象的设计。本质上还是创建对象,调用方法。单例存在的根本就是为了得到对象。 静态类是单纯使用方法体,对象没有存在的价值。所以直接使用类名调用,不创建对象。静态类存在是为了快捷方便的使用里面的方法。 二者设计目标不同。 静态类构造函数没有存在的价值,单例模式需要获取对象,所以必须有构造器,但是私有化。而且可以有非静态的成员。(单例模式推荐使用静态的成员) 单例模式: 第一种: 懒汉式 ①,线程不安全。 实例 public class Singleton { private static Singleton instance; private Singleton (){}

设计模式常见面试题汇总

北战南征 提交于 2020-02-07 14:07:54
设计模式常见面试题汇总 1.说一下设计模式?你都知道哪些? 答:设计模式总共有 23 种,总体来说可以分为三大类:创建型模式( Creational Patterns )、结构型模式( Structural Patterns )和行为型模式( Behavioral Patterns )。 **分类** **包含** **关注点** 创建型模式 工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式 关注于对象的创建,同时隐藏创建逻辑 结构型模式 适配器模式、过滤器模式、装饰模式、享元模式、代理模式、外观模式、组合模式、桥接模式 关注类和对象之间的组合 行为型模式 责任链模式、命令模式、中介者模式、观察者模式、状态模式、策略模式、模板模式、空对象模式、备忘录模式、迭代器模式、解释器模式、访问者模式 关注对象之间的通信 下面会对常用的设计模式分别做详细的说明。 2.什么是单例模式? 答:单例模式是一种常用的软件设计模式,在应用这个模式时,单例对象的类必须保证只有一个实例存在,整个系统只能使用一个对象实例。 优点:不会频繁地创建和销毁对象,浪费系统资源。 使用场景:IO 、数据库连接、Redis 连接等。 单例模式代码实现: class Singleton { private static Singleton instance = new Singleton(); public