单例模式

设计模式之☞单例模式

爷,独闯天下 提交于 2020-01-16 08:37:59
简介 单例模式(Singleton Pattern)是 程序开发 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 注意: 1、单例类只能有一个实例。 2、单例类必须自己创建自己的唯一实例。 3、单例类必须给所有其他对象提供这一实例。 介绍 意图: 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 主要解决: 一个全局使用的类频繁地创建与销毁。 何时使用: 当您想控制实例数目,节省系统资源的时候。 如何解决: 判断系统是否已经有这个单例,如果有则返回,如果没有则创建。 关键代码: 构造函数是私有的。 优点: 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。 2、避免对资源的多重占用(比如写文件操作)。 缺点: 没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。 案例一(无线程): 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using

单例设计模式

匆匆过客 提交于 2020-01-16 06:05:01
单例 (Singleton)设计模式 单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类 只能存在一个对象实例 ,并且该类只提供一个取得其对象实例的方法。 单例模式的优点: 由于单例模式只生成一个实例,减少了系统性能开销,当一个对象的 产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决。 单例(Singleton)设计模式-应用场景 网站的计数器,一般也是单例模式实现,否则难以同步。 应用程序的日志应用,一般都使用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。 数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。 项目中,读取配置文件的类,一般也只有一个对象。没有必要每次使用配置文件数据,都生成一个对象去读取。 Application 也是单例的典型应用 Windows的Task Manager (任务管理器)就是很典型的单例模式 Windows的Recycle Bin (回收站)也是典型的单例应用。在整个系统运行过程 中,回收站一直维护着仅有的一个实例。 单例(Singleton)设计模式-饿汉式 饿汉式单例模式,比较安全,无多线程问题 class Singleton { // 1.私有化构造器 private

Java 单例设计模式 常见4种

a 夏天 提交于 2020-01-16 05:32:21
Java 单例设计模式 常见4种 适合功能场景 主要特点 饿汉式单例 Eager loading(立即加载方式) 懒汉式单例 Lazy Loading(延迟加载方式) 枚举单例 ConcurrentHashMap容器单例 适合功能场景 配置文件读写对象, 数据库连接池, Spring的 IOC容器 ApplicationContext, Windows的任务管理/回收站等 主要特点 单例类只能实例化一次 提供唯一全局访问入口来获取该实例 饿汉式单例 Eager loading(立即加载方式) 项目启动时类被加载, 对象与之同时实例化 除非项目重启否者对象不会有变化, 也就是线程安全的 public class EagerSingleton implements Serializable { private static final long serialVersionUID = 7073777279565036708L; private static volatile EagerSingleton instance = new EagerSingleton(); /** * 为了防止通过反射机制实例化构造方法抛异常 * */ private EagerSingleton() { if(instance != null){ throw new RuntimeException(

通俗易懂设计模式解析——单例模式

懵懂的女人 提交于 2020-01-15 06:14:43
通俗易懂设计模式解析——单例模式 目录 二、单例模式介绍   (一)来由   (二)意图   (三)单例模式实现方法 三、使用场合及优缺点   一、使用场合 二、优点 三、缺点 四、总结 一、前言   在上一节中我们对设计模式进行了一定的介绍及分类。设计模式分为创建型、结构型、行为型。 创建型模式——主要负责对象的创建。结构型职责——主要负责处理类与对象的组合。行为型模式——主要负责类与对象交互中的职责的分配问题 。今天我们也是讲述介绍创建型模式中的第一个模式—— 单例模式 。 回到顶部 二、 单例模式介绍   (一) 来由     单例模式(Singleton Pattern)是最简单的一个设计模式 ,这种设计模式属于创建型模式。在程序中总会有一些特殊的类。它们必须保证在系统中只存在一个实例,这个单一的类自己创建自己的对象,同时确保只有单个对象被创建,并且提供唯一的访问形式。可以直接进行访问,不用再新建实例。     那么如何避开常规的设计,来实现一个类一个实例、并且保证唯一调用呢?这时候就是单例模式施展身手的时候了。   (二) 意图      保证一个类仅有一个实例,并提供一个访问它的全局访问点。   (三) 单例模式实现方法     单例模式到底又是如何实现的呢?既然是单一实例,那么队友多线程又该如何处理呢?下面我们一一来看看单例模式的实现

单例设计模式

不想你离开。 提交于 2020-01-15 05:19:15
什么是单例? 一个类仅有一个实例 解决了全局使用的类频繁的创建与销毁 饿汉式 public class SingletonOne { // 私有化构造方法 private SingletonOne ( ) { } ; // 性能不高 在程序启动的时候 就创建好了对象 对象一直在内存中 // 线程是安全的 public static final SingletonOne hungry = new SingletonOne ( ) ; public static SingletonOne getHungry ( ) { return hungry ; } } 测试 public class Test { public static void main ( String [ ] args ) throws IOException , ClassNotFoundException { // 200 个线程并发访问 int count = 200 ; CountDownLatch latch = new CountDownLatch ( count ) ; for ( int i = 0 ; i < count ; i ++ ) { new Thread ( ) { @Override public void run ( ) { Object register = SingletonOne

设计模式-单例模式

大憨熊 提交于 2020-01-15 04:03:03
对某个类只能存在一个对象实例,并且该类只提供一个获得其对象实例的方法(静态方法) 单例模式的八种方式: 1.饿汉式(静态变量) 2.饿汉式(静态代码块) 3.懒汉式(线程不安全) 4.懒汉式(线程安全,同步方法) 5.懒汉式(线程安全,同步代码块) 6.双重检查 7.静态内部类 8.枚举 饿汉式(静态变量) public class Singleton1 { public static void main(String[] args) { //测试 Singleton instance1=Singleton.getInstance(); Singleton instance2=Singleton.getInstance(); System.out.println(instance1==instance2);//true } } //饿汉式(静态常量) class Singleton{ //1.构造器私有化,外部不能new private Singleton(){ } //2.本类内部创建对象实例 private final static Singleton instance=new Singleton(); //3.提供一个公有的静态方法,返回实例对象 public static Singleton getInstance(){ return instance; } } 优缺点:

单例模式

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

单例模式详解

孤街浪徒 提交于 2020-01-15 00:20:22
设计者模式六大原则: 1.单一原则。描述的意思是每个类都只负责单一的功能,切不可太多业务,导致重复代码,并且一个类应当尽量的把一个功能做到极致。 2. 里氏替换原则:意思是一个子类应该可以替换掉父类并且可以正常工作。通俗的讲师尽量不要重写父类的方法,最好用接口的方式。 3.接口隔离原则:接口最小化原则,强调的是一个接口拥有的行为应该尽可能的小。即通用性,比如定义一个手机接口,只能定义所有手机都具有的特性。并且不能有事先方法。 4.依赖倒置原则:这个原则描述的是高层模块不该依赖于低层模块,二者都应该依赖于抽象,抽象不应该依赖于细节,细节应该依赖于抽象。 5. 迪米特原则:也称最小知道原则,即一个类应该尽量不要知道其他类太多的东西,不要和陌生的类有太多接触。(如果一个类知道或者说是依赖于另外一个类太多细节,这样会导致耦合度过高,应该将细节全部高内聚于类的内部) 6. 开-闭原则:一句话,对修改关闭,对扩展开放。 总体来说设计模式分为三大类 : 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 单例模式详解 :

【设计模式篇】单例模式

喜夏-厌秋 提交于 2020-01-14 21:48:36
01 单例模式     单例模式,只有一个实例存在于整个JVM中,保证只有一个实例,并可以被外界访问。它是一种常用的设计模式之一。实现单例模式 的方法有很多种,然而需要考虑包括线程安全在内的一些因素。以下列举了几种典型的实现方法。 02 实现及问题 方法一:懒汉式实现   【懒汉式】私有化构造函数,创建静态方法,提供单例引用,延迟加载。  重大缺陷:线程不安全, 线程A希望能够使用Singleton 实例 ,于是第一次调用静态方法getInstance(),发现此时singleton==null,准备创建实例,突然CPU发生时间片切换,线程B也希望 调用 该实例,此时A并未创建,因此singleton==null,B创建Singleton实例,执行完成后,线程A继续执行,因为已经判断过singleto n= =null,所以也创建了一个实例对象。 最终导致单例失败。 1 /** 2 * 懒汉式 写法1 3 * @author Administrator 4 * 5 */ 6 public class Singleton { 7 private Singleton(){ 8 9 } 10 private static Singleton singleton=null; 11 //静态工厂方法 12 public static Singleton getInstance(){ 13

单例模式-Singlleton

大城市里の小女人 提交于 2020-01-14 21:28:08
刚正式开始学习设计模式,之前有看过,但是还是觉得亲自写一遍所学的设计模式,并做笔记,这样来说,对于设计模式的理解会更深刻一些。故做笔记,如果有描述不正确的地方欢迎指出。 单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。 通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法就是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法 class Singleton { private static Singleton instance; //构造方法让其private,这就堵死了外界利用new创建此实例的可能 private Singleton() { } //此方法是获得本类实例的唯一全局访问点 public static Singleton GetInstance() { //若实例不存在,则new一个实例,否则返回已有的实例 if (instance == null) { instance = new Singleton(); } return instance; } } View Code 客户端代码 static void Main(string[] args) { Singleton s1 = Singleton.GetInstance(); Singleton s2 =