flutter单例的几种写法

3,660 阅读1分钟

在不考虑线程安全的情况下,我们写一个单例通常是声明一个静态对象,然后在单例方法中判断

class Singleton {
	static Singleton? _singleton;

	// 私有的命名函数,声明后,用户无法通过Singleton()创建一个新的对象
	Singleton._internal();

	static Singleton getInstance() {
		if (_singleton == null) {
			_singleton = Singleton._internal();
		}
		return _singleton;
                
                // 上述判断空的在初始化的代码,可以简化成
                // return _instance ??= Singleton._internal();
	}
        
        // 这样又可以换成箭头符号
        static Singleton getInstance() => _instance ??= Singleton._internal();
}

// 使用
var s = Singleton.getInstance();

在dart中,我们可以不用写一个静态方法,而是写一个静态属性的get方法

class Singleton {
	static Singleton _instance;

	Singleton._internal();

	static Singleton get instance => _intance ??= Singleton._internal();
}

// 使用
var s = Singleton.instance;

通过工厂模式,可以不用通过get方法获取单例

class Singleton {
	static Singleton _instance;

	Singleton._internal();

	factory Singleton() => _instance ??= Singleton._internal();
}

// 使用
var s = Singleton();

由于dart有final描述符,即初始化一次后不会再被初始化,所以我们也可以这样

class Singleton {
	Singleton._internal();
	
	factory Singleton() => _instance;

	static final Singleton _instance = Singleton._internal();
}

// 使用
var s = Singleton();