Java设计模式之单件模式深入讲解

目录
  • 定义
  • Java单件模式
    • 经典单件模式的实现
    • 多线程单件模式的实现
    • 急切创建实例
    • 双重检查加锁
  • Python单件模式
    • 模块实现
    • new关键字实现
    • 装饰器实现
      • 函数装饰器
      • 类装饰器

定义

单件模式确保一个类只有一个实例,并提供一个全局访问点

Java单件模式

经典单件模式的实现

public class Singleton{
	private static Singleton uniqueInstance; // 利用一个静态变量来记录Singleton类的唯一实例
	private Singleton(){} // 把构造器声明为私有的,只有自Singleton类内才可以调用构造器
	// 用getInstance()方法实例化对象,并返回这个实例
	public static Singleton getInstance(){
		if (uniqueInstance == null){
			uniqueInstance = new Singleton();
		}
		return uniqueInstance;
	}
}

在多线程中以上代码会生成多个实例,所以需要我们对代码进行改进

多线程单件模式的实现

public  class Singleton{
	private static Singleton uniqueInstance;

	private Singleton(){}

	public static synchronized Singleton getInstance(){
		if(uniqueInstance == null){
			uniqueInstance = new Singleton();
		}
		return uniqueInstance;
	}
}

通过增加synchronized关键字到getInstance()方法中,我们迫使每个线程在进入这个方法之前,要先等候别的线程离开该方法。也就是说,不会有两个线程可以同时进入这个方法。

急切创建实例

public class Singleton{
	// 在静态初始化器(static initializai)中创建单件。这样可以保证线程安全(thread sate)
	private static Singleton uniqueInstance = new Singleton();

	private static Singleton getInstance(){
		return uniqueInstance;
	}

}

在JVM在加载这个类时马上创建此唯一的单件实例。JVM保证在任何线程访问uniqueInstance静态变量之前,一定创建此实例。

双重检查加锁

会有两次检查实例是否存在,若不存在则创建实例,若存在则返回

public class Singlenton{
	// volatile关键词:当uniqueInstance变量被初始化成Singleton实例时,多个线程正确地处理uniqueInstance变量
	private volatile static Singleton uniqueInstance();

	private Singleton(){}

	public static Singleton getInstance(){
		// 检查实例,如果不存在,就进入同步区块
		if(uniqueInstance == null){
			// 进入区块后,再检查一次。如果仍是null,才创建实例
			synchronized (Singleton.class){
				if(uniqueInstance == null){
					uniqueInstance = new Singleton();
				}
			}
		}
		return uniqueInstance;
	}
}

Python单件模式

模块实现

Python 的模块就是天然的单件模式,在模块第一次被导入时,会生成.pyc文件,之后再次导入时,就会直接加载之前生成的.pyc文件,不会再次执行模块代码
先创建一个Singleton文件

class Singleton:
	def getSingleton:
		pass
singleton = Singleton()

在其他文件中导入这个模块,这个类的地址是唯一的

new关键字实现

当实例化一个对象时,先调用类的__new__方法 ,默认调用的是父类Object.__new__方法,实例化对象。然后再调用类的__init__方法进行属性的初始化。
我们可以再__new__方法内加一个判断,若实例存在,则不实例化,若不存在,则实例化。

class Singleton(object):
    _instance = None
    def __new__(cls, *args, **kwargs):
        if cls._instance is None:
            cls._instance = object.__new__(cls, *args, **kwargs)
        return cls._instance
    def __init__(self):
        pass

装饰器实现

通过装饰器来实现单件模式

函数装饰器

def singleton(cls):
	# 创建一个私有变量,类型为字典,用来存放类地址的
    _instance = {}

    def inner():
    	# 如果类不存在
        if cls not in _instance:
        	# 实例化一个类并存放在字典里
            _instance[cls] = cls()
        return _instance[cls]
    return inner

@singleton
class ClassName(object):
    def __init__(self):
        pass

类装饰器

class Singleton(object):
    def __init__(self, cls):
        self._cls = cls # 接受类名
        self._instance = {} # 存放类地址
    def __call__(self):
        if self._cls not in self._instance:
        	# 实例化类并存放在字典内
            self._instance[self._cls] = self._cls()
        return self._instance[self._cls]

@Singleton
class ClassName(object):
    def __init__(self):
        pass

以上就是Java设计模式之单件模式深入讲解的详细内容,更多关于Java设计模式的资料请关注我们其它相关文章!

(0)

相关推荐

  • 深入理解Java设计模式之单例模式

    目录 一.什么是单例模式 二.单例模式的应用场景 三.单例模式的优缺点 四.单例模式的实现 1.饿汉式 2.懒汉式 3.双重加锁机制 4.静态初始化 五.总结 一.什么是单例模式 单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在. 许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为.比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息.这种方式简

  • 深入理解Java设计模式之代理模式

    目录 一.引言 二.什么是代理模式 三.代理模式的结构 四.代理模式和装饰模式的异同 五.代理模式和委托 六.代理模式的种类 七.代理模式的应用场景 八.代理模式的优缺点 九.代理模式的实现 总结 一.引言 我们都知道,数据库连接是很珍贵的资源,频繁的开关数据库连接是非常浪费服务器的CPU资源以及内存的,所以我们一般都是使用数据库连接池来解决这一问题,即创造一堆等待被使用的连接,等到用的时候就从池里取一个,不用了再放回去,数据库连接在整个应用启动期间,几乎是不关闭的,除非是超过了最大闲置时间.

  • 深入理解Java设计模式之享元模式

    目录 一.引言 二.什么是享元模式 三.享元模式的结构 四.享元模式和单例模式的异同 五.享元模式的优缺点 六.享元模式的使用场景 七.享元模式的实现 八.总结 一.引言 大家都知道单例模式,通过一个全局变量来避免重复创建对象而产生的消耗,若系统存在大量的相似对象时,又该如何处理?参照单例模式,可通过对象池缓存可共享的对象,避免创建多对象,尽可能减少内存的使用,提升性能,防止内存溢出. 在软件开发过程,如果我们需要重复使用某个对象的时候,如果我们重复地使用new创建这个对象的话,这样我们在内存就

  • Java 设计模式之适配器模式详解

    目录 定义 结构图 使用场景 代码实现 Java代码实现 Python代码实现 定义 适配器将一个类的接口,转换成客户期望另一个接口.适配器让原本不兼容的类可以合作无间 结构图 如图所示,两脚插头如何能插入三脚插座,可以在中间加一个适配器进行转换,就能实现两脚插头能插入三脚插座. 使用场景 新的代码兼容旧的代码 使用别人好的代码到自己的代码中 代码实现 适配器模式有:对象适配器和类适配器 Java代码实现 java没有多继承,只能实现对象适配器 先创建两个接口 // 适配目标接口 public

  • 深入理解Java设计模式之桥接模式

    目录 二.桥接模式的结构 三.桥接模式的使用场景 四.桥接模式的优缺点 五.装饰,桥接和适配器模式的异同 适配器模式: 桥接模式: 装饰器模式: 六.桥接模式的实现 七.总结 一.什么是桥接模式 桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化.它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式. 二.桥接模式的结构 在桥接模式结构图中包含如下几个角色: Abstraction(抽象类):用于定义

  • 深入理解Java设计模式之装饰模式

    目录 一.前言 二.什么是装饰模式 1.定义: 2.意图 3.别名 4.动机 5.作用 6.问题 三.装饰模式的结构 四.装饰模式的使用场景 五.装饰模式的优缺点 六.装饰模式的实现 七.装饰模式的.NET应用 八.总结 一.前言 装饰模式实际上是一直提倡的组合代替继承的实践方式,个人认为要理解装饰者模式首先需要理解为什么需要组合代替继承,继承又是为什么让人深恶痛绝. 为什么建议使用组合代替继承? 面向对象的特性有继承与封装,但两者却又有一点矛盾,继承意味子类依赖了父类中的实现,一旦父类中改变实

  • 深入理解Java设计模式之外观模式

    目录 一.什么是外观模式 二.外观模式的使用场景 三.外观模式的优缺点 四.外观模式的实现 总结 一.什么是外观模式 定义:为子系统中的一组接口提供一个一致的界面,用来访问子系统中的一群接口. 外观模式组成: Facade:负责子系统的的封装调用 Subsystem Classes:具体的子系统,实现由外观模式Facade对象来调用的具体任务 二.外观模式的使用场景 1.设计初期阶段,应该有意识的将不同层分离,层与层之间建立外观模式: 2.开发阶段,子系统越来越复杂,增加外观模式提供一个简单的调

  • 深入理解Java设计模式之组合模式

    目录 一.什么是组合模式 动机(Motivation) 意图(Intent) 二.组合模式的结构 结构图说明: 三.组合模式的使用场景 四.组合模式的优缺点 五.组合模式的实现 六.组合模式的.NET下应用 一.什么是组合模式 定义:将对象以树形结构组织起来,以达成"部分-整体"的层次结构,使得客户端对单个对象和组合对象的使用具有一致性. 动机(Motivation) 客户代码过多地依赖于对象容器复杂的内部实现结构,对象容器内部实现结构(而非抽象接口)的变化将引起客户代码的频繁变化,带

  • Java设计模式之单件模式深入讲解

    目录 定义 Java单件模式 经典单件模式的实现 多线程单件模式的实现 急切创建实例 双重检查加锁 Python单件模式 模块实现 new关键字实现 装饰器实现 函数装饰器 类装饰器 定义 单件模式确保一个类只有一个实例,并提供一个全局访问点 Java单件模式 经典单件模式的实现 public class Singleton{ private static Singleton uniqueInstance; // 利用一个静态变量来记录Singleton类的唯一实例 private Single

  • 实例讲解JAVA设计模式之备忘录模式

    在讲述这个模式之前,我们先看一个案例:游戏回档 游戏的某个场景,一游戏角色有生命力.攻击力.防御力等数据,在打Boss前和后会不一样,我们允许玩家如果感觉与Boss决斗的效果不理想,可以让游戏恢复到决斗前.下面是代码: 游戏角色类,用来存储角色的生命力.攻击力.防御力的数据. public class GameRole { private int vit;//生命力 private int atk;//攻击力 private int def;//防御力 //状态显示 public void st

  • Java结构型设计模式之桥接模式详细讲解

    目录 桥接模式 概述 应用场景 优缺点 主要角色 桥接模式的基本使用 创建实现角色 创建具体实现角色 创建抽象角色 创建修正抽象角色 客户端调用 桥接模式实现消息发送 创建实现角色 创建具体实现角色 创建抽象角色 创建修正抽象角色 客户端调用 桥接模式 概述 桥接模式(Bridge Pattern)也称为桥梁模式.接口(Interfce)模式或柄体(Handle and Body)模式,属于结构型模式. 它是将抽象部分与它的具体实现部分分离,使它们都可以独立地变化. 桥接模式主要目的是通过组合的

  • Java设计模式之代理模式原理及实现代码分享

    简介 Java编程的目标是实现现实不能完成的,优化现实能够完成的,是一种虚拟技术.生活中的方方面面都可以虚拟到代码中.代理模式所讲的就是现实生活中的这么一个概念:中介. 代理模式的定义:给某一个对象提供一个代理,并由代理对象控制对原对象的引用. 代理模式包含如下角色: ISubject:抽象主题角色,是一个接口.该接口是对象和它的代理共用的接口. RealSubject:真实主题角色,是实现抽象主题接口的类. Proxy:代理角色,内部含有对真实对象RealSubject的引用,从而可以操作真实

  • Java设计模式之工厂模式实现方法详解

    本文实例讲述了Java设计模式之工厂模式实现方法.分享给大家供大家参考,具体如下: 工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的 工厂模式在分为三类: 1)简单工厂模式(Simple Factory):不利于产生系列产品: 2)工厂方法模式(Factory Method):又称为多形性工厂: 3)抽象工厂模式(Abstract Factory):又称为工具箱,产生产品族,但不利于产生新的产品: 一.简单工厂模式 简单工厂模式又称静态工厂方法模式

  • Java设计模式之工厂模式

    一.场景描述 仪器数据文件的格式包含Pdf.Word.Excel等多种,不同种格式的文件其数据的采集方式不同,因此定义仪器数据采集接口,并定义PDF.Excel等不同的数据采集类实现该接口. 通过工厂类,调用不同的方法,获取不同的仪器数据采集类,调用接口方法即可. 如不使用工厂模式,则需要new不同的采集类对象,使用工厂模式则隐藏了new的创建方式. 如下图所示: 二.示例代码 仪器数据采集接口: package lims.designpatterndemo.factorydemo; publi

  • 一文看懂JAVA设计模式之工厂模式

    工厂顾名思义就是创建产品,根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式.该模式用于封装和管理对象的创建,是一种创建型模式.本文从一个具体的例子逐步深入分析,来体会三种工厂模式的应用场景和利弊. 1. 简单工厂模式 该模式对对象创建管理方式最为简单,因为其仅仅简单的对不同类对象的创建进行了一层薄薄的封装.该模式通过向工厂传递类型来指定要创建的对象,其UML类图如下: 下面我们使用手机生产来讲解该模式: Phone类:手机标准规范

  • Java设计模式之代理模式详解

    一.代理模式 代理模式就是有一个张三,别人都没有办法找到他,只有他的秘书可以找到他.那其他人想和张三交互,只能通过他的秘书来进行转达交互.这个秘书就是代理者,他代理张三. 再看看另一个例子:卖房子 卖房子的步骤: 1.找买家 2.谈价钱 3.签合同 4.和房产局签订一些乱七八糟转让协议 一般卖家只在签合同的时候可能出面一下,其他的1,2,4都由中介去做.那你问这样有什么用呢? 首先,一个中介可以代理多个卖房子的卖家,其次,我们可以在不修改卖家的代码的情况下,给他实现房子加价.打广告等等夹带私货的

  • Java设计模式之备忘录模式_动力节点Java学院

    定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样就可以将该对象恢复到原先保存的状态 类型:行为类 类图: 我们在编程的时候,经常需要保存对象的中间状态,当需要的时候,可以恢复到这个状态.比如,我们使用Eclipse进行编程时,假如编写失误(例如不小心误删除了几行代码),我们希望返回删除前的状态,便可以使用Ctrl+Z来进行返回.这时我们便可以使用备忘录模式来实现. 备忘录模式的结构 发起人:记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责创建和

  • JAVA设计模式之建造者模式原理与用法详解

    本文实例讲述了JAVA设计模式之建造者模式定义与用法.分享给大家供大家参考,具体如下: 建造者模式:将复杂对象的构造与它的实现相分离,让相同的构建过程可以创建不同的对象. 适用场合: 复杂对象的算法应该独立于该对象的组成部分或当构造过程允许被构造不同的对象时. 组成角色: 1 创建者(Builder)接口:为创建一个对象的对应部件所指定抽象接口. 2 具体创建者(ConcreteBuilder):实现Builder的接口以构造对象的各个部件. 3 具体创建者管理对象(Director):使用Bu

随机推荐