单例模式(规整版)

单例模式写法有很多 主要考虑到 以下三方面 1.线程安全 2.不会因为序列化而产生新实例 3.防止反射攻击

之前一直在用饿汉模式,个人推荐枚举,饿汉次之。

单例模式
1、懒汉模式  线程不安全
public class SingleTon {
	private static SingleTon instance;
	private SingleTon() {
	}
	 public static SingleTon getIntence() {

	 if (instance == null) {
	 instance = new SingleTon();
	 }
	 return instance;
	 }
	 }

	 //  懒汉模式 线程安全
public class SingleTon {
		private static SingleTon instance;
	private SingleTon() {
	}
	 public static synchronized SingleTon getIntence() {

	 if (instance == null) {
	 instance = new SingleTon();
	 }
	 return instance;
	 }
	 }

	 2、 饿汉模式   始终有一个实例在内存中
	 //	 饿汉模式 一上来就加载   避免多线程的同步问题  类装载的时候就初始化
	 public class SingleTon {
    public static SingleTon instance=new SingleTon();
	 private SingleTon(){};
	 public static SingleTon getInstance(){
		return instance;
	}
	 }

	 3、静态内部类 延时加载调用时候才有实例在内存中
	 //	静态内部类  保证只有一个线程 类装载的时候不一定初始化
	  public class SingleTon {
	private static class MySington{
		private static final SingleTon myInstance=new SingleTon();
	}
	private SingleTon(){};
	private static SingleTon getinstance(){
		return MySington.myInstance;
	}
		 }

	 4、枚举   自由序列化 保证单个实例  线程安全 方便使用
	 public enum EnumSingleTon {
	INSTANCE;
	private EnumSingleTon() {
	}
	public void sysEnum() {
		System.out.println("来自枚举");
	}
   }

   5、 双层检测锁机制  加强版懒汉模式
	   public class SingleTon {
	 public static SingleTon getInstance(){
		 if(instance==null){  // 单层检测
			 synchronized (SingleTon.class) { // 加锁
				if(instance==null){    // 再次检测
					instance=new SingleTon();
				}
			}
		 }
		 return instance;
	 }
	  }

  

时间: 2024-08-06 11:20:58

单例模式(规整版)的相关文章

【养孩子这么贵,还是生一个算了吧】设计模式之单例模式Java版

定义 单例模式,保证一个类仅有一个实例,并提供一个访问它的全局访问点.所以在需要保证让一个类只有一个实例时,可以参考采用单例模式.通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象.唯一的办法就是,让类自身负责保存它的唯一实例.这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法. 方法一 其一,不让其他类去实例化自己类的实例,那我们很容易想到可以通过定义一个private的构造函数.这是因为如果我们自定义了一个private的构造函数,那么系统默认的

单例模式Singleton-OC版

代码-.h文件: #import <Foundation/Foundation.h> @interface Instance : NSObject + (instancetype)sharedInstance; @end 代码-.m文件: #import "Instance.h" @implementation Instance static id _instance; + (instancetype)allocWithZone:(struct _NSZone *)zone

C++单例模式真的简单吗?

设计模式简介: 设计模式描述了对象如何进行通信才能不牵涉相互的数据模型和方法. 保持这种独立性一直是一个好的面向对象程序设计的目标.  Gang of Four的"Design Patterns: Elements of Resualbel Software"书将设计模式 归纳为三大类型,共23种. 创建型模式 :  通常和对象的创建有关,涉及到对象实例化的方式.(共5种模式) 行为型模式: 通常和对象间通信有关.(共11种模式) 结构型模式: 描述的是如何组合类和对象以获得更大的结构

【Python】《大话设计模式》Python版代码实现

<大话设计模式>Python版代码实现 上一周把<大话设计模式>看完了,对面向对象技术有了新的理解,对于一个在C下写代码比较多.偶尔会用到一些脚本语言写脚本的人来说,很是开阔眼界.<大话设计模式>的代码使用C#写成的,而在本人接触到的面向对象语言中,只对C++和Python还算了解,为了加深对各个模式的理解,我在网上下载了一个C++版的源代码,并根据自己的理解边读这本书边动手实践C++源代码,同时将其改写成了Python代码,算是一箭三雕吧. 由于这些代码的目的是展示各

《大话设计模式》Python版代码实现

上一周把<大话设计模式>看完了,对面向对象技术有了新的理解,对于一个在C下写代码比较多.偶尔会用到一些脚本语言写脚本的人来说,很是开阔眼界.<大话设计模式>的代码使用C#写成的,而在本人接触到的面向对象语言中,只对C++和Python还算了解,为了加深对各个模式的理解,我在网上下载了一个C++版的源代码,并根据自己的理解边读这本书边动手实践C++源代码,同时将其改写成了Python代码,算是一箭三雕吧. 由于这些代码的目的是展示各个设计模式而非完成一个具体的复杂任务,基于C++版本

面试准备之Java常用的设计模式

Java中常用的设计模式 1.单例模式 我所理解的单例模式:整个程序中只允许有唯一的一个对象(这个类只能实例化一次) 看看我找到的解释:当一个类只能有一个对象时,往往会用到单例模式,例如,现实生活中有很多临界资源,像 打印机.处理器(单核).皇帝.太子等等,它们都是稀有资源,只能有一个实例对象 一句话总结:一个类在Java虚拟机中只有一个对象,并提供一个全局访问点. 生活中例子:太阳.月亮.国家主席等. 解决什么问题:对象的唯一性,性能浪费太多. 项目里面怎么用:数据库连接对象,属性配置文件的读

单例模式全面学习(C++版)

单例模式:用来创建独一无二的,只能够有一个实例的对象. 单例模式的结构是设计模式中最简单的,但是想要完全实现一个线程安全的单例模式还是有很多陷阱的,所以面试的时候属于一个常见的考点~ 单例模式的应用场景:有一些对象其实只需要一个,比如:线程池,缓存,对话框,处理偏好设置和注册表的对象,日志对象,充当打印机,显卡等设备的驱动程序对象.这些对象只能够拥有一个实例,如果创建出了多个实例,就会导致一些程序的问题.程序的行为异常,资源使用的过量,或者导致不一致的结果.常用来管理共享的资源,比如数据库的连接

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

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

java版单例模式

单例模式可以说是最常用的设计模式之一,其主要作用就是保证一个类只有一个实例,并且提供一个访问它的全局访问点,严格的控制用户的访问方式. 单例模式又分为懒汉模式和饿汉模式,首先说一下饿汉模式: 饿汉模式 饿汉模式有点饥不择食的意思,就像一个人饿了很久,所以只要有人给东西他就吃而不考虑东西好不好吃,自己能不能吃得了.代码如下: public class Singleton { private static Singleton instance = new Singleton(); private S

单例模式之 懒汉模式普通版

直接上代码: /* 单例模式可以保证:在一个程序当中,一个类有且只有一个实例,并提供一个访问 它的全局访问点 在程序设计当中,很多情况下需要确保一个类只有一个实例 例如: windopws系统中只能有一个窗口管理器 某个程序中只能有一个日志输出系统 一个GUI系统类库中,有且只有一个ImageManager */ #include <iostream> #include "C1.H" #include <windows.h> #include <proce