单例模式:一个类只允许创建一个实例,那么这个类就是单例类,这种设计模式叫做单例模式。
getInstance()
访问。class commonSingleton {
//静态属性——该类的实例
static commonSingleton? _instance;
//私有的命名构造函数,确保类不能从外部被实例化
//(也可以不单独创建构造函数,直接使用默认的无参构造函数————>commonSingleton())
commonSingleton._internal();
//通过静态方法getInstance()访问实例,getInstance()通常是静态方法
/*如果实例存在则返回该实例,如果不存在则调用私有命名构造方法构造一个实例*/
static commonSingleton getInstance(){
if(_instance = =null){
// _instance = commonSingleton();
_instance = commonSingleton._internal();
}
return _instance!;
}
//属性
String text = "这是一个普通的单例模式,使用getInstance()方法";
}
调用方法:
String text1=commonSingleton.getInstance().text;
使用 getter 操作符,可以打破单例模式中既定的,一定要写一个 getInstance()
静态方法的规则,这种方法和普通方法大致相同,只是调用时不需要括号
class getterSingleton{
//静态属性——该类的实例
static getterSingleton? _instance;
//私有的命名构造函数,确保类不能从外部被实例化(也可以不单独创建构造函数,直接使用默认的无参构造
//函数————>commonSingleton())
getterSingleton._internal();
//通过静态方法getInstance()访问实例,getInstance()通常是静态方法
/*如果实例存在则返回该实例,如果不存在则调用私有命名构造方法构造一个实例*/
static get instance {
if(_instance==null){
// _instance=commonSingleton();
_instance=getterSingleton._internal();
}
return _instance!;
}
//属性
String text="这是一个Dart化的单例模式,使用getter操作符";
}
调用方法:
String text2=getterSingleton.instance.text;
Dart 中特有的 工厂构造函数(factory constructor)原生具备了 不必每次都去创建新的类实例 的特性,使用工厂构造函数就不再需要getter操作符额外提供一个函数,而是将单例对象的生成交给了工厂构造函数,工厂构造函数仅在第一次的需要时创建_instance,ing在之后每次返回相同的实例。
class factroySingleton{
//静态属性——该类的实例
static factroySingleton? _instance;
//私有的命名构造函数,确保类不能从外部被实例化,此时不能使用factroySingleton(),会导致无限递归调用工厂构造函数)
factroySingleton._internal();
//工厂构造函数
factory factroySingleton(){
if(_instance==null){
_instance=factroySingleton._internal();
}
return _instance!;
}
//属性
String text="这是一个Dart化的单例模式,使用工厂构造函数";
}
调用方法:
String text3=factroySingleton().text;
//Dart化-工厂构造函数+空安全+箭头函数
class factroySingletonNullJudget{
static factroySingletonNullJudget? _instance;
factroySingletonNullJudget._internal(){
_instance=this;
}
factory factroySingletonNullJudget()=> _instance??factroySingletonNullJudget._internal();
//属性
String text="这是一个Dart化的单例模式,使用工厂构造函数+空安全+箭头函数";
}
调用方式:
String text4=factroySingletonNullJudget().text;
完整调用及结果 :
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutterapp/%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F/factory_singleton.dart';
import 'package:flutterapp/%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F/getter_singleton.dart';
import '../单例模式/Common_Singleton.dart';
import 'null_judge_singleton.dart';
main()=>runApp(MyApp());
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: "单例模式",
home: HYHomePage(),
);
}
}
class HYHomePage extends StatelessWidget {
String text1=commonSingleton.getInstance().text;
String text2=getterSingleton.instance.text;
String text3=factroySingleton().text;
String text4=factroySingletonNullJudget().text;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("单例模式"),
),
body: Center(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(text1,style: TextStyle(fontSize: 20,color: Colors.redAccent),),
SizedBox(height: 20,),
Text(text2,style: TextStyle(fontSize: 20,color: Colors.redAccent),),
SizedBox(height: 20,),
Text(text3,style: TextStyle(fontSize: 20,color: Colors.redAccent),),
SizedBox(height: 20,),
Text(text4,style: TextStyle(fontSize: 20,color: Colors.redAccent),),
],
),
),
);
}
}