单例模式

单例模式(Singleton)

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

单例模式及线程安全问题

大兔子大兔子 提交于 2020-02-07 02:30:09
1. 什么是单例模式 单例模式是为确保一个类只有一个实例,并为整个系统提供一个全局访问点的一种模式方法。 单例的特点: 在任何情况下,单例类永远只有一个实例存在 单例需要有能力为整个系统提供这一唯一实例 2. 单例模式之懒汉式单例 实现代码: public class MySingleton { private static MySingleton instance = null; private MySingleton(){} public static MySingleton getInstance() { try { if(instance != null){//懒汉式 }else{ //创建实例之前可能会有一些准备性的耗时工作 Thread.sleep(300); instance = new MySingleton(); } } catch (InterruptedException e) { e.printStackTrace(); } return instance; } } 假设在创建实例前有一些准备性的耗时工作要处理,多线程调用: public class MyThread extends Thread{ @Override public void run() { System.out.println(MySingleton.getInstance()

js_单例设计模式

淺唱寂寞╮ 提交于 2020-02-07 00:40:27
实现单例模式 单例模式的定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。 单例模式的实现:主要通过创建一个标志变量来保存第一次创建过的实例,当下一次获取该类的实例时进行判断标志变量是否已经被赋值,如果已被赋值直接返回标志位上保存的值。 //第一种 var Singleton = function ( name ) { this . name = name ; this . instance = null ; } ; Singleton . prototype . getName = function ( ) { alert ( this . name ) ; } ; Singleton . getInstance = function ( name ) { if ( ! this . instance ) { this . instance = new Singleton ( name ) ; } return this . instance ; } ; var a = Singleton . getInstance ( 'sven1' ) ; var b = Singleton . getInstance ( 'sven2' ) ; alert ( a === b ) ; // true //第二种 var Singleton = function ( name )

设计模式之单例模式

心不动则不痛 提交于 2020-02-06 18:06:16
1.单例模式简介 单例模式,就是采取一定的方法保证在整个的软件系统中,对某一个类只存在一个对象实例,并且该类只提供一个取得其对象的方法。 2.单例模式的实现方法 单例模式的实现方法分为8种,主要分为: 1.饿汉式(静态常量)(√) 2.饿汉式(静态代码块)(√) 3.懒汉式(线程不安全) 4.懒汉式(线程安全,同步方法) 5.懒汉式(线程安全,同步代码块) 6.双重检查(√) 7.静态内部类(√) 8.枚举类(√) 2.1: 饿汉式(静态常量) 核心代码 : private static SingletonByStatic instance = new SingletonByStatic(); 优点 :简单,在类装载的时候已经完成了实例化,避免了线程同步 缺点 :在类装载的时候就完成实例化,没有达到 lazyloading(懒加载),如果从始至终没有使用过这个实例,则会造成内存的浪费 。导致类装载的原因可能有很多种,这时候万一初始化了instance,未使用。造成了内存的浪费 完整代码: package com.liz.GOF23.singleton.hungry_man; //饿汉式(静态变量) //优点: 简单,在类装载的时候已经完成了实例化,避免了线程同步 //缺点: 在类装载的时候就完成实例化,没有达到 lazyloading(懒加载),如果从始至终没有使用过这个实例

23种设计模式

女生的网名这么多〃 提交于 2020-02-06 02:57:58
23种模式java实现源码 收集五年的开发资料下载地址 : http://pan.baidu.com/share/link?shareid=3739316113&uk=4076915866#dir/path=%2Fstudy 一、设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 其实还有两类:并发型模式和线程池模式。用一个图片来整体描述一下: 二、设计模式的六大原则 1、开闭原则(Open Close Principle) 开闭原则就是说 对扩展开放,对修改关闭 。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。 2、里氏代换原则(Liskov Substitution Principle) 里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。

设计模式(Design Patterns)

和自甴很熟 提交于 2020-02-06 01:41:11
设计模式(Design Patterns) 一、设计模式的分类 总体来说设计模式分为三大类: 创建型模式 ,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式 ,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式 ,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 其实还有两类: 并发型模式和线程池模式 。用一个图片来整体描述一下: 二、设计模式的六大原则 1、开闭原则(Open Close Principle) 开闭原则就是说 对扩展开放,对修改关闭 。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。 2、里氏代换原则(Liskov Substitution Principle) 里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用

Java设计模式之单例模式

喜夏-厌秋 提交于 2020-02-05 13:20:44
Java设计模式之单例模式 饿汉模式 public class Singleton { private static Singleton instance = new Singleton(); private Singleton() {} public static Singleton getInstance() { return instance; } } 饿汉模式在类加载的时候就对实例进行初始化,实例在整个程序周期中都存在。它的优点在于只在类加载的时候创建一次实例,不会存在多个线程创建多个实例的问题。它的缺点在于即使这个单例没有使用他也会被创建,造成了内存浪费。 懒汉模式 懒汉模式单线程 public class Singleton { private static Singleton instance = null; private Singleton() {} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } 懒汉模式只有在需要创建实例的时候才会被创建,如果实例已被创建,多次调用getInstance()接口也也会创建一次,返回之前创建的对象实例。但是它并没有考虑线程安全的问题

单例模式——我只有一个对象

与世无争的帅哥 提交于 2020-02-03 22:02:18
面试官:带笔了吧,那写两种单例模式的实现方法吧 沙沙沙刷刷刷~~~ 写好了 面试官:你这个是怎么保证线程安全的,那你知道,volatile 关键字? 类加载器?锁机制???? 点赞+收藏 就学会系列,文章收录在 GitHub JavaEgg ,N线互联网开发必备技能兵器谱 单例模式——独一无二的对象 单例模式,从我看 《Java 10分钟入门》那天就听过的一个设计模式,还被面试过好几次的设计模式问题,今天一网打尽~~ 有一些对象我们确实只需要一个,比如,线程池、数据库连接、缓存、日志对象等,如果有多个的话,会造成程序的行为异常,资源使用过量或者不一致的问题。你也许会说,这种我用全局变量不也能实现吗,还整个单例模式,好像你很流弊的样子,如果将对象赋值给一个全局变量,那程序启动就会创建好对象,万一这个对象很耗资源,我们还可能在某些时候用不到,这就造成了资源的浪费,不合理,所以就有了单例模式。 单例模式的定义 单例模式确保一个类只有一个实例,并提供一个全局唯一访问点 单例模式的类图 单例模式的实现 饿汉式 static 变量在类装载的时候进行初始化 多个实例的 static 变量会共享同一块内存区域 用这两个知识点写出的单例类就是饿汉式了,初始化类的时候就创建,饥不择食,饿汉 public class Singleton { //构造私有化,防止直接new private

Servlet单例模式(注意)

安稳与你 提交于 2020-02-03 03:15:52
1 package com.servlet; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.http.HttpServlet; 7 import javax.servlet.http.HttpServletRequest; 8 import javax.servlet.http.HttpServletResponse; 9 10 /** 11 * Servlet implementation class Test 12 */ 13 public class Test extends HttpServlet { 14 private static final long serialVersionUID = 1L; 15 private long abc = 123; 16 ThreadLocal<String> local = new ThreadLocal<String>(); 17 /** 18 * @see HttpServlet#HttpServlet() 19 */ 20 public Test() { 21 super(); 22 // TODO Auto-generated constructor stub 23 } 24

剑指Offer对答如流系列 - 实现Singleton模式

若如初见. 提交于 2020-01-31 00:54:05
目录 面试题2:实现Singleton模式 一、懒汉式写法 二、饿汉式写法 三、枚举 面试题2:实现Singleton模式 题目:设计一个类,我们只能生成该类的一个实例。 由于设计模式在面向对象程序设计中起着举足轻重的作用,在面试过程中很多公司都喜欢问一些与设计模式相关的问题。在常用的模式中,Singleton是唯一一个能够用短短几十行代码完整实现的模式。因此,写一个Singleton的类型是一个很常见的面试题。 如果你看过我之前写的设计模式专栏,那么这道题思路你会很开阔。 单例模式的要点有三个:一是 某个类只能有一个实例 ;二是 它必须自行创建这个实例 ;三是 它必须自行向整个系统提供这个实例 。 我们下面来看一下它的实现 一、懒汉式写法 public class LazySingleton { private static LazySingleton lazySingleton = null; private LazySingleton() { } public static LazySingleton getInstance() { if(lazySingleton == null) { lazySingleton = new LazySingleton(); } return lazySingleton; } } 关键就是将构造器私有,限制只能通过内部静态方法来获取一个实例