第二百一十九回

发布时间:2023年12月22日


我们在上一章回中介绍了"分享三个使用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的工厂方法;
    看官们,与"如何创建单例模式"相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!
文章来源:https://blog.csdn.net/talk_8/article/details/135142566
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。