单例模式

单例模式

天涯浪子 提交于 2019-11-27 16:08:12
这里主要讲一下懒汉模式和恶汉模式 1) 懒汉模式: //懒汉模式 public class LazySingle { private static LazySingle sInstance = null; private LazySingle() {} public static LazySingle getInstance() { if (sInstance == null) { sInstance = new LazySingle(); } return sInstance; } } 这是非线程安全的写法,在多线程并发执行的时候,就会很容易出现安全隐患。 优点:懒加载启动快,资源占用小,使用时才实例化,无锁。 缺点:不安全 接下来看看线程安全的写法,其实就是加个锁 public class LazySingle { private static LazySingle sInstance = null; private LazySingle() {} public static LazySingle getInstance() { if (sInstance == null) { synchronized (LazySingle.class) { if (sInstance == null) { sInstance = new LazySingle(); } } } return

设计模式----单例模式

微笑、不失礼 提交于 2019-11-27 15:44:12
设计模式 大佬们提供的一些面对经典的常见场景,所给定的一些对应的解决方案 单例模式特点 比如说,某些类,就只能拥有一个对象 实现方式 懒汉模式 在需要用到这个对象时再实例化出对象 懒汉模式的核心思想就是“延时加载”,从而能够优化服务器的启动速度 实现 template <typename T> class Singleton { static T* inst; public: static T* GetInstance() { if (inst == NULL) { inst = new T(); } return inst; } }; //这种实现方式没有考虑到线程安全 //下面给出一种线程安全版本的 //如果在创建这个线程时,有两个线程进入了,那么就会实例出两个对象,这与单例模式思想不符,但是 //后面再进入的话就不会有影响了 // 懒汉模式, 线程安全 template <typename T> class Singleton { volatile static T* inst; // 需要设置 volatile 关键字, 否则可能被编译器优化. static std::mutex lock; public: static T* GetInstance() { if (inst == NULL) { // 双重判定空指针, 降低锁冲突的概率, 提高性能. lock.lock(

Re单例模式-懒汉饿汉

这一生的挚爱 提交于 2019-11-27 15:17:31
单例设计模式:解决一个类在内存中只存放一个对象。 ---------------------对象在内存中的唯一性------------------- 1. 为了避免其它程序过多建立该类对象。先禁止其它程序建立该类对象; 2. 还为了让其它程序可以访问到该类对象,只好在本类中自定义一个对象; 3. 为了方便其他程序对自定义对象的访问,可以提供一些访问方式。 怎么用代码体现呢? 1. 将构造函数私有化; 2. 在类中创建一个本类对象; 3. 提供一个方法可以获取到该对象。 对于事物该怎么描述,就怎么描述 当需要将该事物的对象保证在内存中唯一时,就将以上三步相加即可。 class Demo { private Demo(){} private static d = new Demo(); public static Demo getInstance() { return d; } } //单例设计模式: 先初始化对象: 称为:饿汉式 //对象的延迟加载,称为懒汉式。 会涉及到多线程的安全问题,需要上锁 class Demo { private Demo(){} private static Demo d = null; public static Demo getInstance() { if(d==null) { synchronized( Demo.class ) { if(d=

单例模式

让人想犯罪 __ 提交于 2019-11-27 14:10:08
一、基于__new__ class Single: _instance = None def __new__(cls, *args, **kwargs): if not cls._instance: cls._instance = super(Single, cls).__new__(cls, *args, **kwargs) return cls._instance class Demon(Single): def foo(self): print("Hi") d1 = Demon() d2 = Demon() print(id(d1))  # 2110545800776 print(id(d2))  # 2110545800776 二、基于模块 1、重点:一个文件在一个项目中只加载一次 来源: https://www.cnblogs.com/wt7018/p/11366942.html

枚举类 --单例模式

给你一囗甜甜゛ 提交于 2019-11-27 13:26:40
单例设计模式 :         1、 私有构造;   2、创建本类对象;  3、对外提供访问方法 import java.util.jar.Attributes.Name; public class Week { private String name; public static final Week MON = new Week("星期一"); public static final Week TUE = new Week("星期二"); public static final Week WES = new Week("星期三"); private Week(String name){ this.name = name; } public String getName() { return name; } } 枚举类 就是有多个实例 Enum 所有枚举类 都是Enum 的子类 枚举项必须放在第一行 枚举类的方法: ordinal() 返回序号 compareTo(Enum e) 比较的是序号 name() 返回此枚举常量的名称,在其枚举声明中对其进行声明。 valueOf(class<T> type , String name) week2 mon = week2.valueOf(week2.class , mon) 通过字节码文件获取枚举项 values() Week

设计模式(单例模式、工厂、简单工厂、抽象工厂、代理模式、装饰者模式、观察者模式、适配器模式)

☆樱花仙子☆ 提交于 2019-11-27 12:50:55
一、单例模式 二、代理模式 一、单例模式 1.单例模式的定义 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。 2.单例模式的特点 单例类只能有一个实例。 单例类必须自己创建自己的唯一实例。 单例类必须给所有其他对象提供这一实例。 3.单例模式的应用 在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。 这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态。 4.单例模式的Java代码 单例模式分为懒汉式(需要才去创建对象)和饿汉式(创建类的实例时就去创建对象)。 5.饿汉式 属性实例化对象 //饿汉模式:线程安全,耗费资源。 public class HugerSingletonTest { //该对象的引用不可修改 private static final HugerSingletonTest ourInstance = new HugerSingletonTest(); public static HugerSingletonTest getInstance() {

单例模式

不羁岁月 提交于 2019-11-27 10:49:11
Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例、饿汉式单例、登记式单例。   单例模式有以下特点:   1、单例类只能有一个实例。   2、单例类必须自己创建自己的唯一实例。   3、单例类必须给所有其他对象提供这一实例。 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。 在讲单例之前,要做一次基础知识的科普行动。大家都知道Java类加载器加载内容的顺序: 1、从上往下(Java的变量需要先声明才能使用) 2、静态后动态(对象实例化)(静态块和static关键字修饰在实例化以前分配内存空间) 3、先属性后方法(成员变量不能定义在方法中,只能定义在class下) 二、懒汉式单例(4种写法) 1.普通懒汉模式 package spring_singleton; /** * @author pypua * @date

设计模式----单例模式

不羁的心 提交于 2019-11-27 10:22:14
单例模式的实现有以下几种: 1.饿汉模式(线程安全,浪费资源),直接实例化,不是延迟加载 private static Singleton uniqueInstance = new Singleton();2.懒汉模式(线程不安全)延迟加载,节约资源;但是多线程的情况下,没办法确保单例。线程安全模式,双重校验锁先判断 uniqueInstance 是否已经被实例化,如果没有被实例化,那么才对实例化语句进行加锁。3.静态内部类,运用java加载机制,类加载的时候不会被加载,单调方法是才会被加载。缺点:会被反射破坏4.枚举实现5.序列化://序列化反序列化协议 private Object readResolve() { return INSTANCE; } 6.注册式单例: 来源: https://www.cnblogs.com/wakakCode/p/11359093.html

java设计模式-- 单例模式

a 夏天 提交于 2019-11-27 09:20:29
在很久之前,也就是在大二暑假的时候,那时候看马士兵的视频教程中有提到很多的设计模式。 java的设计模式大致可以分为3大类,23种设计模式。 其中,创建型模式有5种: 单例模式 、建造者模式、原型模式、工厂模式、抽象工厂模式。 结构型模式有7种:设配器模式、装饰器模式、代理模式、外观模式、享元模式、组合模式、桥接模式。 行为模式一种有11种:策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 这23种设计模式并不是相互独立的,它们之间也有相互的联系。 本篇中要讲的是单例模式。 单例模式顾名思义,就是指本系统中只允许存在 一个实例 。它是一个比较基本的模式,我们日常设计中经常使用到的设计模式之一,比方说我们经常使用的线程池,缓存,对话框,打印机,日志对象,显卡等设备驱动,这类对象只能有一个势力,如果制作多个势力,就可能会导致一些问题。通过单例模式,我们可以方便对实例的个数进行控制从而节省一些系统开销。在单例模式中,我们有饿汉模式和懒汉模式。字面理解,饿汉模式就是肚子饿了,一开始就把单例创建出来了,懒汉模式就是肚子不饿,等到肚子饿时(系统调用)才去创建。 恶汉模式是线程安全的,懒汉模式因为在调用时创建,所以是非线程安排。 在创建单例模式时,我们一般都需要把构造方法私有化,然后再我们的类中声明一个静态方法

单例模式常见有哪几种?

半世苍凉 提交于 2019-11-27 08:47:30
package com.zhuyca.singleton; // 饿汉式 public class Singleton { private static Singleton instance = new Singleton(); private Singleton() {} public static Singleton getInstance() { return instance; } } // 懒汉式 class Singleton2 { private static Singleton2 instance = null; private Singleton2() {} public static Singleton2 getInstance() { if(instance == null) { instance = new Singleton2(); } return instance; } } // 懒汉加锁 class Singleton3 { private static Singleton3 instance = null; private Singleton3() {} public static synchronized Singleton3 getInstance() { if(instance == null) { instance = new