单例设计模式那些事儿
单例设计模式是最常用的设计模式之一。单例设计模式,单就其名字就可以大概知道其意义。单,也就是一个;例,也就是实例对象。所以说单例就是只有一个实例化对象。因此我们可以对单例设计模式作如下的定义:
单例设计模式用于限定某个特定对象只能被创建一次,并且向整个系统提供对自身共享访问。
单例设计模式一般只允许创建自身的一个实例,因此在最初实例化的时候,会创建一个对象存储在自身内部。在接下来使用该对象的时候,该对象都会先检查存储器查看是否已经实例化了该对象,如果已经具有自身的实例,那么就返回引用,否则就按照上面所说创建自身的一个对象存储在自身内部供请求使用。
单例设计模式的原理可以说就是上面所说的,可以说它是独立于编程语言的。但是由于不同的编程语言其语法的差异,导致单例设计模式的实现也有所不同,我们就拿Java和PHP为例来说明一下。
对于Java,单例设计模式根据实例化对象的时间的不同可以分为懒汉式和饿汉式。
所谓饿汉式单例就是说当单例类被加载的时候就实例化一个自身对象存储在自身内部。
代码如下:
public class Singleton{
private static Singleton singleton = new Singleton();
private Singleton(){}
public static Singleton __Instance(){
return singleton;
}
}
通过以上代码我们看到在类开始加载的时候,就声明了一个private static 变量 singleton,并且实例化了自身的对象,将该对象赋值给变量 singleton。这就是所谓的饿汉式单例。
所谓懒汉式单例就是说只有在调用产生实例对象的方法时才会去实例化自身对象,并将其存储在自身内部。
代码如下:
public class Singleton {
private static Singleton singleton;
private Singleton(){}
public static synchronized Singleton __Instance(){
if(singleton==null){
singleton = new Singleton();
}
return singleton;
}
}
以上代码可以看到只有当调用__Instance()方法的时候首先会判断变量 singleton是否为空,如果不为空说明实例化对象已经被创建,否则创建实例化对象赋值给变量singleton。
以上是Java的代码,因为Java是编译型的语言,所以它支持在类加载时就实例化该对象。
但是对于PHP来说,PHP是解释型语言,在类没有加载完成,它是不能实例化该类的对象的,所以说PHP不支持饿汉式单例,也就是说以下代码有错误无法通过的。
class Singleton{
private static $singleton = new self;
private function __construct(){}
public static function __Instance(){
return self::$singleton;
}
}
因此PHP只支持懒汉式单例,代码如下:
class Singleton{
private static $singleton;
private function __construct(){}
public static function __Instance(){
if(!self::$singleton instanceof self){
self::$singleton = new self;
}
return self::$singleton;
}
}
使用单例设计模式最常用的场景就是创建连接数据库对象。数据库访问对象是用来负责创建一个数据库连接实例的。无论何时只要调用该对象的特定方法,它就会使用它已经创建的连接资源。众所周知创建一个数据库连接资源的花销是很大的(需要花销很多的时间和资源)。因此在设计代码的时候应该尽可能少的去创建数据库连接资源。
对于大多数情况下,当数据库的数据被取出以后,数据库连接资源没有必要继续保存着了,可以释放掉。鉴于这种情况,将数据库访问对象变成单例是很有意义的。当每次有新的数据操作需要一个新的数据库访问对象的时候,先前的对象会被重复使用,不用再去实例化一个新的数据库访问对象去额外的建立数据库连接资源了。
因此我们可以知道,使用单例设计模式可以节省内存空间,避免了重复创建和销毁对象,提高了性能等等。
因为,单例设计模式经常被应用于连接数据库,所以我写了一个操作数据库的类,该类在设计的时候尝试使用了单例设计模式。
源码托管在github上,并且对于类的功能的使用有简单的介绍,欢迎大家下载。
相关文章
如何在 Java 中使用复合设计模式?
发布时间:2023/02/09 浏览次数:151 分类:算法
-
你好 Java 程序员,如果大家想了解 Java 中的 复合设计模式 ,例如如何实现复合设计模式以及何时使用它,那么来对地方了。 在本文中,我们将讨论 复合设计模式 。 复合设计模式(
Java 中的观察者设计模式
发布时间:2023/02/09 浏览次数:83 分类:算法
-
Java 中的 观察者设计模式 是一种基本的核心 Java 模式,其中 Observe 监视 Subject 的状态或属性的任何变化。 例如,公司向所有股东更新他们在这里做出的任何决定公司是主体,股东是观
Java 中的适配器 vs 装饰器 vs 门面 vs 代理设计模式
发布时间:2023/02/09 浏览次数:170 分类:算法
-
Adapter(适配器)、Decorator(装饰器)、Facade(门面) 和 Proxy(代理) 设计模式之间有一些惊人的相似之处,因为它们都使用组合和委托来解决问题。 适配器模式 包装一个接口,并将
如何在 Java 中使用适配器设计模式
发布时间:2023/02/08 浏览次数:145 分类:算法
-
Java 中的 适配器设计模式 ,也称为 Wrapper 模式,是另一个非常有用的 GOF 模式,它有助于弥合 Java 中两个类之间的差距。 根据四人组模式列表,适配器是一种结构模式,很像 Java 中的代
如何在 Java 中使用状态设计模式?
发布时间:2023/02/08 浏览次数:119 分类:算法
-
状态(State)设计模式 是一种行为模式。 状态模式 看起来类似于策略模式,但它有助于管理对象状态,从而使它们在不同状态下表现不同。 在这个例子中,我们将采用一个著名的面向对
如何在 Java 中实现命令设计模式
发布时间:2023/02/08 浏览次数:128 分类:算法
-
大家好,今天,我们将学习一种重要的设计模式,它经常被 Java 开发人员忽视。 是的,我说的是 命令模式 ,它可以帮助我们编写灵活、松散耦合的代码来实现应用程序中的操作和事件
Java 装饰器设计模式示例
发布时间:2023/02/08 浏览次数:106 分类:算法
-
大家好,如果想了解 Java 中的 装饰器设计模式 ,那么你来对地方了。由于设计模式在构建软件时非常重要,在任何核心 Java 面试中也同样重要,因此清楚地了解 Java 中的各种设计模式
如何在 JavaScript ES6+ 中实现单例模式
发布时间:2023/02/08 浏览次数:190 分类:算法
-
在这篇文章中,我们将向大家展示如何在 JavaScript 中实现单例模式。 如果我们是一名全栈 JavaScript 开发人员,就会知道 JavaScript 是一种功能强大的语言,可以使用它来构建令人惊叹的网
Java中的策略设计模式和开闭原则
发布时间:2023/02/01 浏览次数:170 分类:算法
-
策略设计 模式基于 开闭设计原则 ,即著名的 SOLID 设计原则的 O 。 它是与 装饰器模式 、 观察者模式 和 工厂模式 一起在面向对象分析和设计领域中流行的模式之一。 策略模式允许我