我们在本章回中介绍的单例模式是指设计模式中的单例模式,该模式可以确保有且仅有一个实例对象,属于常用的设计模式之一。我估计大家在项目中经常用到该模式。本
章回中将介绍如何使用dart语言来实现单例模式。
实现单例模式的思路主要包含两个部分:创建一个唯一的实例对象,向外提供一个接口来获取实例对象。创建实例对象时先判断实例对象是否已经存在,如果实例对象已经
存在就返回已经存在的实例对象,否则通过类的构造函数创建一个新的实例对象。通过接口获取实例对象时返回类中已经创建的实例对象就可以,不过需要把类的构造函数
私有化,这样才能保证类的外部不能使用构造函数来创建类的实例对象。当然了,在Java语言中单例模式有懒汉模式,饿汉模式等方式,我们在这里介绍的实现思路是最
基础的一种实现方式,也就是懒汉模式。
介绍完实现思路后,我们按照此思路来实现单例模式,详细的步骤如下:
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,这样使用代码更加容易理解。
我们在本章回中介绍了单例模式的概念和实现方法,其实它的核心思想没有变,主要是实现方法和其它语言不一样,因此我们单独使用一个章回来介绍它。最后,我们对本
章回的内容做一个全面的总结: