第二百一十五回 如何创建单例模式

文章目录

  • 1. 概念介绍
  • 2. 思路与方法
    • 2.1 实现思路
    • 2.2 实现方法
  • 3. 示例代码
  • 4. 内容总结

我们在上一章回中介绍了"分享三个使用TextField的细节"沉浸式状态样相关的内容,本章回中将介绍 如何创建单例模式.闲话休提,让我们一起Talk Flutter吧。

1. 概念介绍

我们在本章回中介绍的单例模式是指设计模式中的单例模式,该模式可以确保有且仅有一个实例对象,属于常用的设计模式之一。我估计大家在项目中经常用到该模式。本章回中将介绍如何使用dart语言来实现单例模式。

在这里插入图片描述

2. 思路与方法

2.1 实现思路

实现单例模式的思路主要包含两个部分:

  • 创建一个唯一的实例对象;
  • 向外提供一个接口来获取实例对象;

创建实例对象时先判断实例对象是否已经存在,如果实例对象已经存在就返回已经存在的实例对象,否则通过类的构造函数创建一个新的实例对象。

通过接口获取实例对象时返回类中已经创建的实例对象就可以,不过需要把类的构造函数私有化,这样才能保证类的外部不能使用构造函数来创建类的实例对象。

当然了,在Java语言中单例模式有懒汉模式,饿汉模式等方式,我们在这里介绍的实现思路是最
基础的一种实现方式,也就是懒汉模式。

2.2 实现方法

介绍完实现思路后,我们按照此思路来实现单例模式,详细的步骤如下:

  • 创建一个名叫_instance的静态成员来存当单例对象;
  • 使用_internal()方法实例化_instance对象,相当于私有化类的构造方法;
  • 提供一个名叫getInstance()的工厂方法返回_instance对象,该方法可以保证实例的唯一性;

在上面的实现方法中,如果类中有成员变量或者方法,我们可以在_internal()方法中初始化成员变量,或者调用成员方法,我们将在后面小节中通过示例代码来演示。

3. 示例代码

class BleImpl {final String deviceId;final String notifyServiceUUId;final String writeServiceUUId;void anyFunc(){///do something}static final _instance = BleImpl._internal(ScanDeviceViewModel().connectedDeviceId,PrivateData.notifyCharacteristicUuid,PrivateData.writeServiceUuid,);///创建单例对象,使用了工厂方法BleImpl._internal(this.deviceId,this.notifyServiceUUId,this.writeServiceUUId,){anyFunc();}//factory getInstance() => _instance;factory BleImpl() => _instance;
}

在上面的示例代码中,我们创建一个名叫BleImpl的类,类中有三个成员变量和一个成员方法。我们在_internal()方法中初始化了三个成员变量,同时调用了类的成员方法。

_internal()是dart语言特有的语法,它是一个内部库提供的命名构造方法,相当于把类的构造方法私有化,这样就不能从类的外部创建类的对象。

此外,给类外部获取实例对象的方法getInstance()使用了factory关键字,这也是dart特有的语法,它表示类的工厂方法,它保证了返回实例对象的唯一性,而且在调用工厂方法时不需要通过类的名称或者对象的名称来调用该方法,直接使用方法的名称就可以调用该方法,因此,我们建议把该方法的名称从传统的getInstance修改成类名,也就是代码中的BleImpl,这样使用代码更加容易理解。

4. 内容总结

我们在本章回中介绍了单例模式的概念和实现方法,其实它的核心思想没有变,主要是实现方法和其它语言不一样,因此我们单独使用一个章回来介绍它。最后,我们对本
章回的内容做一个全面的总结:

  • 单例模式主要用来实现一个唯一的实例对象;
  • 单例模式的实现思路主要包含创建唯一实例对象和返回实例对象两部分;
  • 创建唯一实例对象使用了dart的_internal()方法;
  • 返回实例对象使用了dart的工厂方法;

看官们,与"如何创建单例模式"相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/234503.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java实现局域网内视频投屏播放(三)投屏原理

常见投屏方案 常见的投屏方案主要有以下几种: DLNA DLNA的全称是DIGITAL LIVING NETWORK ALLIANCE(数字生活网络联盟)。DLNA委员会已经于2017年1月5日正式解散,原因是旧的标准已经无法满足新设备的发展趋势,DLNA标准将来也不会再更新。但是…

C 库函数 - mktime()

描述 C 库函数 time_t mktime(struct tm *timeptr) 把 timeptr 所指向的结构转换为自 1970 年 1 月 1 日以来持续时间的秒数,发生错误时返回-1。 声明 下面是 mktime() 函数的声明。 time_t mktime(struct tm *timeptr)参数 timeptr – 这是指向表示日历时间的…

Day18

Day18 一,Map 1,HashMap 1.1HashMap的使用 import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.Map.Entry; import java.util.Set;public class Test01 {/*** 知识点:HashMap的使用*/public static void main(…

【MySQL】数据库基础入门 安装MySQL

目录 介绍: 安装MySQL: 设置 root 账号密码 2.配置环境变量 2.找到 Path 系统变量, 点击 "编辑" 介绍: MySQL是一个开源的关系型数据库管理系统(RDBMS),它是一种用于管理和存储数据的软件。 安装MySQL: …

MyBatis进行CRUD中添加数据实现主键回填

文章目录 MyBatis进行CRUD中添加数据实现主键回填1、创建一个mybatis项目2、实现添加数据时主键回填在MyBatisTest.java中添加下面方法在UserMapper.java中添加对应的属性在UserMapper.xml中添加sql语句如下运行结果如下(取消commit方法注释后就不会出现Rolling back回滚进行真…

hive数据库分区表数据迁移到另一个分区/数据复制

文章目录 一、分区表数据迁移到另一个分区表1.1、方式一1.2、方式二 二、报错解决 一、分区表数据迁移到另一个分区表 有个需求,创建一张备份表,将分区表中的数据迁移到备份表中。以下整理一下几种迁移方式。 创建分区表: create table use…

JRT打印元素绘制协议整合PDF

打印不光要能打印内部的单据,对于检验的打印还有外送回传的PDF报告也需要能够打印,所以需要把打印PDF文件整合进来,为此给打印元素绘制协议增加PDF类型的元素。 定义如下,由绘制协议按地址下载文件后和其他打印元素整合&#xff…

107基于matlab的模糊推理系统(ANFIS)的时间序列预测

基于matlab的模糊推理系统(ANFIS)的时间序列预测,输出训练集、测试集和预测数据结果,数据可更换自己的,程序已调通,可直接运行。 107 时间序列预测模糊推理系统 (xiaohongshu.com)

[ZJCTF 2019]NiZhuanSiWei1

[ZJCTF 2019]NiZhuanSiWei1 预测试 打开网页就是代码&#xff1a; <?php $text $_GET["text"]; $file $_GET["file"]; $password $_GET["password"]; if(isset($text)&&(file_get_contents($text,r)"welcome to the zjct…

金蝶云星空部署包执行后元数据对象的变化和使用

文章目录 金蝶云星空部署包执行后元数据对象的变化和使用 金蝶云星空部署包执行后元数据对象的变化和使用 部署包执行后&#xff0c;会将执行的元数据记录了部署包的版本号&#xff0c;带上改部署包的开发商标识&#xff0c;在被执行后部署包环境里只有当前开发商下的开发者才…

Android Selinux权限之MLS

MLS Selinux MLS 相关的在 国内Andoriod 官网未找到&#xff0c;只有博客的说明。 源码在 system/sepolicy/private/mls &#xff0c; 截取部分&#xff0c; # Read operations: Subject must dominate object unless the subject # or the object is trusted. mlsconstrai…

ObjectArx调用cad内部命令

PhdArxCadCmd.h #pragma once #include <memory> #include <mutex>class PhdArxCadCmd final { public:static PhdArxCadCmd* Instance();private:PhdArxCadCmd() default;static std::unique_ptr<PhdArxCadCmd> m_self; //声明静态对象public://关闭命令回…

【论文笔记】MCANet: Medical Image Segmentation withMulti-Scale Cross-Axis Attention

医疗图像分割任务中&#xff0c;捕获多尺度信息、构建长期依赖对分割结果有非常大的影响。该论文提出了 Multi-scale Cross-axis Attention&#xff08;MCA&#xff09;模块&#xff0c;融合了多尺度特征&#xff0c;并使用Attention提取全局上下文信息。 论文地址&#xff1a…

蔚来打败“蔚来”

作者 | 魏启扬 来源 | 洞见新研社 继2019年后&#xff0c;又一次深陷倒闭传闻的蔚来汽车&#xff0c;“在关键时刻找到钱了”。 12月18日&#xff0c;蔚来汽车宣布&#xff0c;与阿布扎比投资机构CYVN Holdings签订新一轮股份认购协议&#xff0c;CYVN Holdings将通过其附属公…

四色问题(图论)python

四色问题是一种著名的图论问题&#xff0c;它要求在给定的地图上给每个区域着一种颜色&#xff0c;使得相邻的区域颜色不同&#xff0c;而只使用四种颜色。这个问题可以通过图的着色来解决&#xff0c;其中图的节点表示区域&#xff0c;边表示相邻的关系。 在 Python 中&#…

打印⾃幂数

1.题目描述 题目描述&#xff1a; 写⼀个代码打印1~100000之间的所有的⾃幂数&#xff0c;中间⽤空格分隔。 ⾃幂数是指⼀个数的位数的n次⽅等于这个数本⾝。例如&#xff0c;153是⾃幂数1^35^33^3153。 2.题目分析 题目分析&#xff1a; 1. 计算输入数的位数n。 2. 计算输入…

excel导出,post还是get请求?

1&#xff0c;前提 今天在解决excel导出的bug时&#xff0c;因为导出接口查询参数较多&#xff0c;所以把原来的get请求接口修改为post请求 原代码&#xff1a; 修改后&#xff1a; 2&#xff0c;修改后 postman请求正常&#xff0c;然后让前端对接口进行同步修改&#xff0…

前端高频编程题

文章目录 前言1.防抖2.节流3.数组去重4.数组拍平5.深拷贝6.柯里化7.并发请求 前言 JS常见面试编程题 1.防抖 function debounce(fn, delay) {let timer null;return function(...args) {if (timer) {clearTimeout(timer)}timer setTimeout(()>{timer null;fn.apply(thi…

(datetime/subprocess)模块

datetime 模块说白了就是 Python 中用于处理日期和时间的模块。 【 一 】导入模块 import datetime 【 二 】主要类 datetime模块中包含的主要类为&#xff1a; date&#xff1a;日期对象&#xff0c;常用的属性有year, month, day等time&#xff1a;时间对象&#xff0c;…

Clion自定义管理和配置软件构建过程的工具(代替CMake)构建程序

在公司由于需要x86环境和其他arm环境&#xff0c;同时需要使用公司自定义的mine_x86或者mine_orin对代码进行编译。 编译命令如下mine_x86 build -Dlocal1 -j8,为使用Clion对程序进行调试&#xff0c;需要对程序进行设置。方便调试代码时能够断点查看变量。尝试了很多次&#…