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

文章目录

  • 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.mfbz.cn/a/257804.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

03-数据结构-栈与队列

1.栈 栈和队列是两种操作受限的线性表。如上图所示显示栈的结构 栈:先进后出,入栈(数据进入) 和出栈(数据出去)均在栈顶操作。 常见栈的应用场景包括括号问题的求解,表达式的转换和求值&#…

记录每日LeetCode 162.寻找峰值与1901.寻找峰值II Java实现

寻找峰值 题目描述: 峰值元素是指其值严格大于左右相邻值的元素。 给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。 你可以假设 nums[-1] nums[n] -…

Unity3d C#利用Editor编辑器拓展实现配置UI背景样式一键设置UI背景样式功能(含源码)

前言 在开发UI滚动列表的时候,经常会有每项的背景图不统一的情况,会间隔重复的情况居多。这种情况下,手动去设置间隔一行的背景图或者颜色是比较麻烦的。在此背景下,笔者尝试写个小工具,在搭建UI时配置一下循环背景的…

开发知识点-09Rust

Rust Rust 语言通常用于编写系统级软件、网络服务器和高性能应用程序,它具有以下特点:1. 高性能和内存安全:Rust 在保证高性能的同时,利用其所有权模型和借用检查器等特性确保内存安全,避免了 C/C 等语言的内存错误和崩…

MySQL数据库——SQL语法

Structured Query Language(结构化查询语言),简称SQL,是用于操作关系型数据库的标准编程语言。SQL提供了一种与数据库交互的方式,可以用于查询、插入、更新和删除数据库中的数据。 1. SQL通用语法 SQL语句可以写在一…

Jenkins Docker Cloud在Linux应用开发CI中的实践

Jenkins Docker Cloud在Linux应用开发CI中的实践 背景 通过代码提交自动触发CI自动构建、编译、打包是任何软件开发组织必不可少的基建,可以最大程度保证产物的一致性,方便跨组跨部门协作,代码MR等。 Docker在流水线中越来越重要&#xff…

行为型设计模式(一)模版方法模式 迭代器模式

模板方法模式 Template 1、什么是模版方法模式 模版方法模式定义了一个算法的骨架,它将其中一些步骤的实现推迟到子类里面,使得子类可以在不改变算法结构的情况下重新定义算法中的某些步骤。 2、为什么使用模版方法模式 封装不变部分:模版…

Home Assistant HAOS版如何安装HACS

环境: Home Assistant 11.2 SSH & Web Terminal 17.0 问题描述: Home Assistant HAOS版如何安装HACS 解决方案: 1.打开WEB 里面的终端输入下面命令 wget -O - https://hacs.vip/get | bash -如果上面的命令执行后卡住不动&#xff…

得物-Golang-记一次线上服务的内存泄露排查

1.出现内存泄漏 1.1 事发现场 在风和日丽的一天,本人正看着需求、敲着代码,展望美好的未来。突然收到一条内存使用率过高的告警。 1.2 证人证词 告警的这个项目,老代码是python的,最近一直在go化。随着go化率不断上升&#xff…

maven 项目导入异常问题

问题如下 一、 tomcat正再运行的包是哪一个 不同构建、打包情况下分别运行 out\artifacts下 当直接去Project Structure下去构建artifacts 后,运行tomcat 则会在out下target下 reimport项目后,则会在artifacts自动生成部署包。删除tomcat之前deployment 下的包(同…

Android studio Android SDK下载安装

我们访问地址 https://developer.android.google.cn/studio?hlzh-cn 拉下来直接点击下载 然后来下来 勾选 然后点击下载 下载好之后 我们双击打开 点击下一步 确认上面的勾选 然后下一步 这里 我们选择一下安装目录 然后点击下一步 安装 安装完之后点击进行下一步 Fin…

JDK各个版本新特性

JDK8新特性 Java 8 发布于 2014 年 3 月份,可以说是 Java 6 之后最重要的版本更新,深受开发者的喜爱。 函数式编程和 Lambda 表达式 Stream 流 参考:https://mp.weixin.qq.com/s/7hNUjjmqKcHDtymsfG_Gtw 单从“Stream”这个单词上来看&…

【数据结构】栈的使用|模拟实现|应用|栈与虚拟机栈和栈帧的区别

目录 一、栈(Stack) 1.1 概念 1.2 栈的使用 1.3 栈的模拟实现 1.4 栈的应用场景 1. 改变元素的序列 2. 将递归转化为循环 3. 括号匹配 4. 逆波兰表达式求值 5. 出栈入栈次序匹配 6. 最小栈 1.5 概念区分 一、栈(Stack) 1.1 概念 栈:一种特殊的线性表&…

解决腾讯云CentOS 6硬盘空间不足问题:从快照到数据迁移

引言: 随着数据的不断增加,服务器硬盘空间不足变成了许多运维人员必须面对的问题。此主机运行了httpd(apache服务),提供对外web访问服务,web资源挂载在**/data/wwwroot目录下,http日志存放在/data/wwwlogs目录下&…

创建型设计模式 | 原型模式

一、原型模式 1、原理 原型模式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。原型像是一个模板,可以基于它复制好多…

el-form与el-upload结合上传带附件的表单数据(前端篇)

1.写在之前 本文前端采用Vue element-plus技术栈,前端项目参考yudao-ui-admin-vue3项目与Geeker-Admin项目。 这篇文章是el-form与el-upload结合上传带附件的表单数据(后端篇)-CSDN博客姐妹篇,后端篇文章主要讲的是后端的实现逻…

左移运算符(<<),右移运算符(>>)

#include <stdio.h>int main() {int a 10, b 10, c -10, d -10;int a1 0, a2 0, a3 0, a4 0, a5 0; int b1 0, b2 0, b3 0, b4 0, b5 0; int c1 0, c2 0, c3 0, c4 0, c5 0; int d1 0, d2 0, d3 0, d4 0, d5 0;//a10,左移a1 a << 1; a2…

JDK各个版本特性讲解-JDK14特性

JDK各个版本特性讲解-JDK14特性 一、Java14概述二、语法层面的变化1. instanceof2. switch表达式3. 文本块的改进4. Records记录类型 二、关于GC1.G1的NUMA内存分配优化2. 弃用SerialCMS,ParNewSerial Old3.删除CMS4.ZGC on macOS and Windows 三、其他变化1.友好的空指针异常提…

【动态规划】08路径问题_下降路径最小和_C++(medium)

题目链接&#xff1a;leetcode下降路径最小和 目录 题目解析&#xff1a; 算法原理 1.状态表示 2.状态转移方程 3.初始化 4.填表顺序 5.返回值 编写代码 题目解析&#xff1a; 题目让我们求通过 matrix 的下降路径 的 最小和 由题可得&#xff1a; 在下一行选择的元…

纸白银投资开户有什么条件?

在金融市场中&#xff0c;白银作为一种重要的贵金属&#xff0c;一直以来都备受投资者的关注。而纸白银&#xff0c;作为白银投资的一种形式&#xff0c;更是因其交易灵活、风险相对较小的特点&#xff0c;吸引了大量的投资者。那么&#xff0c;纸白银投资开户有什么条件呢&…
最新文章