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

文章目录

  • 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.hqwc.cn/news/287166.html

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

相关文章

初学gitrepo的种种

经过各种折腾之后,发现git其实还是很简单的; 首先你需要两台机器,一台作为服务器,一台作为开发机器,开发机器从服务器上拉取代码。 目 目录 git建仓 开发机器拉取代码 初始化仓代码 repo管理 repo工具的下载 …

晶体管的工作状态判断和工作条件

晶体管是模拟电路中基础的器件,对于电子工程师来说,了解晶体管工作的条件和判断晶体管的工作状态都是非常基础的,本文将带大家一起学习或回顾一下。 一、晶体管工作的条件 1.集电极电阻Rc: 在共发射极电压放大器中,…

Re解析(正则表达式解析)

正则表达式基础 元字符 B站教学视频: 正则表达式元字符基本使用 量词 贪婪匹配和惰性匹配 惰性匹配如下两张图,而 .* 就表示贪婪匹配,即尽可能多的匹配到符合的字符串,如果使用贪婪匹配,那么结果就是图中的情况三 p…

智能高效的Go开发工具GoLand v2023.3发布,支持AI辅助编码!

GoLand 使 Go 代码的阅读、编写和更改变得非常容易。即时错误检测和修复建议,通过一步撤消快速安全重构,智能代码完成,死代码检测和文档提示帮助所有 Go 开发人员,从新手到经验丰富的专业人士,创建快速、高效、和可靠的…

使用Gensim训练Word2vec模型

1、训练Gensim模型 import gensim # gensim 4.3.2 import jieba import re import warnings import logging warnings.filterwarnings(ignore)with open("dataset/sanguo.txt", r,encodingutf-8)as f: # 读入文本,此处使用的是三国演义,可自…

开启创意之旅:免费、开源的噪波贴图(noise texture)生成网站——noisecreater.com详细介绍

在当今数字创意领域,噪波贴图(Noise Texture)是游戏渲染、游戏开发、美术设计以及影视制作等行业不可或缺的艺术素材之一。为了满足广大创作者的需求,noisecreater.com应运而生,成为一款免费、开源的噪波贴图生成工具。…

HarmonyOS:Neural Network Runtime对接AI推理框架开发指导

场景介绍 Neural Network Runtime 作为 AI 推理引擎和加速芯片的桥梁,为 AI 推理引擎提供精简的 Native 接口,满足推理引擎通过加速芯片执行端到端推理的需求。 本文以图 1 展示的 Add 单算子模型为例,介绍 Neural Network Runtime 的开发流…

支持向量机 支持向量机概述

支持向量机概述 支持向量机 Support Vector MachineSVM ) 是一类按监督学习 ( supervisedlearning)方式对数据进行二元分类的广义线性分类器 (generalized linear classifier) ,其决策边界是对学习样本求解的最大边距超亚面 (maximum-margin hyperplane)与逻辑回归和…

如何用ChatGPT进行“论文翻译+润色+AI制图”

1、熟练掌握ChatGPT提示词技巧及各种应用方法,并成为工作中的助手。 2、通过案例掌握ChatGPT撰写、修改论文及工作报告,提供写作能力及优化工作 3、熟练掌握ChatGPT融合相关插件的应用,完成数据分析、编程以及深度学习等相关科研项目。 4、…

Nodejs 第二十八章(邮件服务)

邮件服务在我们工作中邮件服务充当着一个重要的角色 任务分配与跟踪:邮件服务可以用于分配任务、指派工作和跟踪项目进展。通过邮件,可以发送任务清单、工作说明和进度更新,确保团队成员了解其责任和任务要求,并监控工作的完成情况…

Labview Vision 机器视觉使用,从下载程序安装应用,到实战找硬币并输出值

1.前言 大家好,今天我要和机器人一起配合来打算 做机器视觉 用Labview 和 Vision 联动实现机器的视觉 2.下载软件-软件的安装 我们除了基础款的labview软件 还要安装视觉四件套 1.Labview 编程平台(我是 2023 q3) 2. NI - IMAQdx (驱动软…

Win10 / Win11 的 Arc 浏览器Beta版测试

Arc 浏览器Beta版测试 Arc 采用了和主流浏览器不同的用户界面,采用名为 Arc Library 的左侧边栏,可以访问 Spaces、Today 标签、Pinned 标签、收藏夹、画架和笔记等生产力工具。