设计模式 | 单例模式
时间:2022-07-22
本文章向大家介绍设计模式 | 单例模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
首先说明一下, 设计模式不局限于语言之间, 思想一致, 都是为了更好的解决软件设计中的问题, 博主这里使用PHP
做示例, 其他语言中如果设计方式有不一样的会进行说明的。
说明
单例模式是设计模式中非常常用的一种设计方案, 顾名思义就是只有一个实例。单例模式确保某一个类只有一个实例,不能重复实例,只能它自己实例化,而且向整个系统提供这个实例。
一个类只被实例化一次,当其他人对其再次实例化时,返回第一次实例化的对象,可以避免大量的new
操作,减少资源的消耗,典型应用于数据库类的实例化。
一般就是三私一公
- 构造函数私有化
- 克隆函数私有化
- 私有存放实例的成员属性
- 公有获取实例的函数 并且设为静态方法
示例
<?php
/**
* Created by 憧憬.
*/
class Singleton
{
//私有属性,用于保存实例
private static $instance;
//构造方法私有化,防止外部创建实例
private function __construct(){}
//公有属性,用于测试
public $name;
/**
* 公有方法,用于获取实例
* @return Singleton
* @author: 憧憬
*/
public static function getInstance(){
//判断实例有无创建,没有的话创建实例并返回,有的话直接返回
if(!(self::$instance instanceof self)){
self::$instance = new self();
}
return self::$instance;
}
//克隆方法私有化,防止复制实例
private function __clone(){}
}
$instance = Singleton::getInstance();
$instance->name = '这是实例化的第一个对象, 然后给他设置属性值';
$newInstance = Singleton::getInstance();
$newInstance->name = '新对象进行修改';
echo $newInstance->name; // 新对象进行修改
echo $instance->name; // 新对象进行修改
java童鞋注意
java
是多线程, 以上例子在java
设计里面是非线程安全的, 可以为根据业务, 使用频率上不同锁, 具体请百度, 这里不做多赘述, 重点在于思想。
本文为作者原创,手码不易,允许转载,转载后请以链接形式说明文章出处。
- 【译】使用 dotnet watch 开发 ASP.NET Core 应用
- vmware安装ubuntu12.04嵌套安装xen server(实现嵌套虚拟化)
- Golang语言切片slice的线程协程安全问题
- ASP.NET Core 在 Azure 开启 HTTPS
- 算法基础:最大递减数问题(Golang实现)
- 亲身经历的痛--database/sql: Stmt的使用以及坑
- Ubuntu上通过nginx部署Django笔记
- Go学习笔记:golang交叉编译
- Python魔术方法-Magic Method
- python类中super()和__init__()的区别
- Python正则表达式:最短匹配
- 转--Go时间格式化和类型互换操作
- Python标准库(1) — itertools模块
- Linux笔记:使用Vim编辑器
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法