Flutter之单例模式的四种方法

单例模式:一个类只允许创建一个实例,那么这个类就是单例类,这种设计模式叫做单例模式。

创建单例类的方法 

普通单例

  • 单例类(Singleton)中包含一个引用自身类的静态属性实例(instance),且能自行创建这个实例。
  • 该实例只能通过静态方法 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;

Dart化-getter操作 

使用 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化-工厂构造函数

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化-工厂构造函数+空安全+箭头函数

//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),),
          ],
        ),
      ),
    );
  }
}

Flutter之单例模式的四种方法_第1张图片

你可能感兴趣的:(Flutter学习,单例模式,flutter)