单例模式

偷学代码之单例模式

 ̄綄美尐妖づ 提交于 2019-12-02 06:19:13
初级程序员,也被称为搜索程序员。 1.啥是单例模式 在JAVA中单例模式是23种设计模式之一,也是最常用的 设计模式 。 单例模式分三种:懒汉式单例、饿汉式单例、登记式单例。 单例模式有以下特点:   1、单例类只能有一个实例。   2、单例类必须自己创建自己的唯一实例。   3、单例类必须给所有其他对象提供这一实例。   单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。 总之,选择单利模式就是为了避免不一致状态,避免政出多头。 一些常用的底层操作,比如数据库连接,获取数据库配置文件的操作等等,我们可以将这些操作提取到一个工具类(ConfigManager.java),并把它设计为单例模式。 2.它长啥样 下面给出一个经典例子: public class Singleton{ private static Singleton unique Instance=null; private Singleton(){ /

单例模式

徘徊边缘 提交于 2019-12-02 05:36:43
/** * 饿汉式 在类加载时实现初始化,浪费内存 * 线程安全 * 用于访问量大,多线程访问 * */public class Utils{ private static final Utils instanch=new Utils(); private Utils() { } public static Utils getInstance (){ return instanch; }} /** * 懒汉式 在调用时实现初始化 * 非线程安全 * 用于访问量少,单线程访问,多线程时可能会出现实例化多个对象 * eg:线程A,B同时执行到if (instance == null) { 中会有多个实例 */public class Utils { private static Utils instance; private Utils() { } public static Utils getInstance() { if (instance == null) { instance = new Utils(); } return instance; }} /** * 懒汉式优化(DCL式) 在调用时实现初始化 * 非线程安全 * 用于访问量少,单线程访问,多线程时可能会出现实例化多个对象 * synchronized: 只允许一个线程进入特定代码段,从而避免多线程同时修改同一数据

Java笔试面试-设计模式

。_饼干妹妹 提交于 2019-12-02 05:22:28
1.说一下设计模式?你都知道哪些? 答:设计模式总共有 23 种,总体来说可以分为三大类:创建型模式( Creational Patterns )、结构型模式( Structural Patterns )和行为型模式( Behavioral Patterns )。   ①创建型模式( Creational Patterns ): 工厂模式(Factory pattern) 抽象工厂模式(Abstract Factory Pattern) 单例模式(Singleton Patern) 创建者模式(Builder Pattern) 原型模式(Prototype Pattern)   ②结构型模式( Structural Patterns ): 适配器模式(Adapter Pattern) 桥接模式(Bridge Pattern) 过滤器模式(Filter Pattern) 组合模式(Composition Pattern) 装饰器模式(Decorator Pattern) 外观模式(Facade Pattern) 代理模式(Proxy Pattern) 享元模式(Flyweight Pattern)   ③行为型模式( Behavioral Patterns ): 访问者模式(Visitor Pattern) 模板模式(Template Pattern) 空对象模式(Null

JAVA设计模式学习--单例模式

独自空忆成欢 提交于 2019-12-02 05:21:42
单例模式 学习 :     单例模式只能产生一个对象。     那么这个对象就不能被其它对象创建,只能自己创建,要实现只能自己创建就要做到私有化构造方法;     现在别人不能创建了,那得让对象存在且能被使用吧,所以就要自己创建并提供一个别人访问的方法;     什么样的方法能被其他对象直接使用,所以需要将自己创建的对象用static修饰为静态的,既然对象是静态的,那么方法也应该跟着静态化了。     1、私有化构造方法     2、提供一个其他对象能够调用对象的方法     3、方法和自己创建的对象静态化  手写一个单例模式(一定要自己根据思路写下来,再简单也要写): public class Singleton{     private static Singleton s = new Singleton();     private Singleton(){};     public static Singleton getInstance(){       return s;     }     //提供一个测试方法     public void run(){       System.out.println("我是个单例!");     } } 单例模式的另一种写法:懒汉式 public class LazySingleton(){     private

单例模式(单例设计模式)详解

陌路散爱 提交于 2019-12-02 05:10:34
在有些系统中,为了节省内存资源、保证数据内容的一致性,对某些类要求只能创建一个实例,这就是所谓的单例模式。 单例模式的定义与特点 单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。例如,Windows 中只能打开一个任务管理器,这样可以避免因打开多个任务管理器窗口而造成内存资源的浪费,或出现各个窗口显示内容的不一致等错误。 在计算机系统中,还有 Windows 的回收站、操作系统中的文件系统、多线程中的线程池、显卡的驱动程序对象、打印机的后台处理服务、应用程序的日志对象、数据库的连接池、网站的计数器、Web 应用的配置对象、应用程序中的对话框、系统中的缓存等常常被设计成单例。 单例模式有 3 个特点: 单例类只有一个实例对象; 该单例对象必须由单例类自行创建; 单例类对外提供一个访问该单例的全局访问点; 单例模式的结构与实现 单例模式是设计模式中最简单的模式之一。通常,普通类的构造函数是公有的,外部类可以通过“new 构造函数()”来生成多个实例。但是,如果将类的构造函数设为私有的,外部类就无法调用该构造函数,也就无法生成多个实例。这时该类自身必须定义一个静态私有实例,并向外提供一个静态的公有函数用于创建或获取该静态私有实例。 下面来分析其基本结构和实现方法。 单例模式的结构 单例模式的主要角色如下。 单例类

python三种方法创建单例模式

自作多情 提交于 2019-12-02 05:03:05
# 方法一,装饰器 from functools import wraps def single_instance(cls): """装饰器实现单例模式,装饰器相当于把类给包了起来,强制返回一个对象""" _instance = None @wraps(cls) def wrapper(*args, **kwargs): nonlocal _instance if _instance is None: _instance = cls(*args, **kwargs) return _instance return wrapper @single_instance class Test1: def __init__(self, name): self.name = name print("Test init..., name=%s" % self.name) # 方法二 __new__方法 class Test2: _instance = None def __init__(self, name): self.name = name print("Test2 init..., name=%s" % self.name) def __new__(cls, *args, **kwargs): """__new__主要做的是给实例分配空间,__init__则是在该空间上进行初始化

单例模式

末鹿安然 提交于 2019-12-02 02:08:57
设计模式概述 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案(也就是现成的套路) 分类:创建型模式、结构型模式、行为型模式 设计模式是基于场景的解决方案 单例模式的定义和作用 目的: 使得类的一个对象成为该类系统中的唯一实例 定义: 一个类有且仅有一个实例,并且自行实例化向整个系统提供 要点: 1.某个类只能有一个实例 2.必须自行创建实例 3.必须自行向整个系统提供这个实例 实现: 1.只提供私有的构造方法 2.含有一个该类的静态私有对象 3.提供一个静态的公有方法用于创建、获取静态私有对象 代码实现方案:饿汉式(对象创建过程中实例化)、懒汉式(静态公有方法中实例化) 饿汉式代码实现 实例化对象的类 package com.imooc.singleton; ​ //饿汉式:创建对象实例的时候直接初始化 空间换时间 public class SingletonOne { //1.创建类中私有构造 private SingletonOne() { } //2.创建该类型的私有静态实例 private static SingletonOne instance = new SingletonOne(); //3。创建公有静态方法返回静态实例对象 public static SingletonOne getInstance() { return instance; } }

09 单例设计模式、__new__函数

隐身守侯 提交于 2019-12-02 02:08:33
设计模式 设计模式是前任工作的总结和提炼,通常,被人们广泛流传的设计模式都是 针对某一特定问题 的 成熟的解决方案 。 使用设计模式是为了可重用代码、让代码更容易的被他人理解、保证代码的可靠性。 单例设计模式 单例即指只有一个实例 目的:让该类创建的对象,在系统中只有一个实例 每一次创建此类的对象,内存地址都是相同的 单例设计模式的应用场景 音乐播放 对象 回收站对象 打印机对象 。。。 __new__函数 __new_函数是一个内置函数,用来创建一个实例,在内存中为它开辟一个空间,并返回 内存地址 单例模式的思路 定义一个类属性,用以接收实例的地址 拓展__new__函数,判断定义的类属性,如果为空,则调用super().__new__并用类属性接收它返回的地址,然后返回该类属性 如果类属性,则直接返回类属性 这样无论创建多少个对象,他们都指向同一个内存空间,也就是只有一个实例。 单例模式演示 class MusicPlayer(object): instance = None #用以接收对象的内存地址 init_flag = False #判断__init__()用以标记函数有没有被执行过 def __new__(cls, *args, **kwargs): if cls.instance is None: cls.instance = super().__new__(cls)

设计模式(一)——单例模式

删除回忆录丶 提交于 2019-12-02 00:36:18
单例模式是设计模式中最简单的一种,主要目的就是确保程序运行期间只有一个对象被创建。 特点:构造函数私【私有】、类内部有【私有】自身类型的属性、提供获取实例的静【静态】方法; 好处是大大减少了对象创建时的性能损耗和内存占用; 单例模式的创建方式有 懒汉模式、饿汉模式、双重锁模式、静态内部类单例模式、枚举单例模式 1、懒汉模式: /// <summary> /// 懒汉单例 /// </summary> public class SingletonLH { /// <summary> /// 私有的自身类型的属性 /// </summary> private static SingletonLH singletonLH; /// <summary> /// 私有构造函数 /// </summary> private SingletonLH(){} /// <summary> /// 获取对象的静态方法 /// </summary> /// <returns></returns> public static SingletonLH GetSingletonLH() { if (singletonLH is null) singletonLH = new SingletonLH(); return singletonLH; } } 缺点:线程不安全、延迟初始化,严格意义上不算是单例模式

设计模式之单例模式

心不动则不痛 提交于 2019-12-01 18:45:20
参考资料: 老司机来教你单例的正确姿势 《Android源码设计模式解析与实战》 单例模式可以说是应用最广泛的模式了, 面试也经常被问到, 经常会被要求能够手写单例, 所以我今天也来总结一下 单例模式的定义 确保某一个类只有一个实例, 并且自定实例化并向整个系统提供这个实例 单例模式的使用场景 确保某个类有且只有一个对象的场景, 避免产生多个对象消耗过多的资源, 或者某种类型的对象只应该有且只有一个.例如, 创建一个对象需要消耗的资源过多, 如要访问IO和数据库等资源 单例的UML类图 插点题外话说一下怎么看UML类图, 例如这里的Singleton矩形框就代表一个类, 第一层显示类的名称, 抽象类用斜体表示; 第二层是类的特性, 通常是字段和属性; 第三层是类的操作, 通常是方法. ‘+’表示public, ‘-‘表示private, ‘#’表示protected, 例如这里的getInstance()方法是public的, 构造方法是private的. 与类图有区别的是接口图, 顶端有 <<interface>> 显示 实现单例模式有一下几个关键点: 构造函数不对外开放, 一般为private, 是的客户端不能通过new的形式手动构造单例类的对象 通过一个静态方法或者枚举返回单例类对象 在多线程环境中也需要确保单例类的对象有且只有一个 确保单例类对象在反序列化时不会重新构建对象