abstract factory(笼统工厂)形式:提供一些创立相似目标或许归于同一类目标的接口,而不是详细的实例。

形式结构

Flutter设计模式(一)- 抽象工厂模式

经过笼统AbstactFactory类,并定义该笼统类的两个必须方法CreateProductA()CreateProductB()。由承继至该笼统类的实例,完成详细的完成。

StatefulWidget

Flutter中,StatefulWidget就是一个笼统类,其间,里面定义了一个必要的方法 createState()

abstract class StatefulWidget extends Widget {
  /// Initializes [key] for subclasses.
  const StatefulWidget({ Key? key }) : super(key: key);
  @override
  StatefulElement createElement() => StatefulElement(this);
  @protected
  @factory
  State createState(); // ignore: no_logic_in_create_state, this is the original sin
}

这就规范了所有的StatefulWidget都会创立一个State

示例代码

接下来,经过示例来体验这种设计形式。我们将经过单选框的选中和非选中,来切换iOSAndroid两种不同风格的组建展现。 完成效果如下图

Flutter设计模式(一)- 抽象工厂模式

首要创立三个用于渲染组件的笼统类:IActivityIndicator、ISlider、ISwitch

abstract class IActivityIndicator {
  Widget render();
}
abstract class ISlider {
  Widget render(double value, ValueSetter<double> onChanged);
}
abstract class ISwitch {
  Widget render(bool value, ValueSetter<bool> onChanged);
}

全体页面的笼统类:

abstract class IWidgetFactory {
  String getTitle();
  IActivityIndicator createActivityIndicator();
  ISlider createSlider();
  ISwitch createSwitch();
}

别离创立iOS风格android风格Widget实例目标。

class MaterialIWidgetsFactory implements IWidgetFactory {
  @override
  IActivityIndicator createActivityIndicator() {
    // TODO: implement createActivityIndicator
    return AndroidActivityIndicator();
  }
  @override
  ISlider createSlider() {
    // TODO: implement createSlider
    return AndroidSlider();
  }
  @override
  ISwitch createSwitch() {
    // TODO: implement createSwitch
    return AndroidSwitch();
  }
  @override
  String getTitle() {
    // TODO: implement getTitle
    return "Android Widgets";
  }
}
class CupertinoWidgetsFactory implements IWidgetFactory {
  @override
  IActivityIndicator createActivityIndicator() {
    // TODO: implement createActivityIndicator
    return IOSActivityIndicator();
  }
  @override
  ISlider createSlider() {
    // TODO: implement createSlider
    return IOSSlider();
  }
  @override
  ISwitch createSwitch() {
    // TODO: implement createSwitch
    return IOSSwitch();
  }
  @override
  String getTitle() {
    // TODO: implement getTitle
    return "iOS Widgets";
  }
}
class AndroidActivityIndicator implements IActivityIndicator {
  @override
  Widget render() {
    // TODO: implement render
    return CircularProgressIndicator(
      backgroundColor: const Color(0xFFECECEC),
      valueColor: AlwaysStoppedAnimation<Color>(Colors.black.withOpacity(0.65)),
    );
  }
}
class IOSActivityIndicator implements IActivityIndicator {
  @override
  Widget render() {
    // TODO: implement render
    return const CupertinoActivityIndicator();
  }
}
class AndroidSwitch implements ISwitch {
  @override
  Widget render(bool value, ValueSetter<bool> onChanged) {
    // TODO: implement render
    return Switch(value: value, onChanged: onChanged);
  }
}
class IOSSwitch implements ISwitch {
  @override
  Widget render(bool value, ValueSetter<bool> onChanged) {
    // TODO: implement render
    return CupertinoSwitch(value: value, onChanged: onChanged);
  }
}
class AndroidSlider implements ISlider {
  @override
  Widget render(double value, ValueSetter<double> onChanged) {
    // TODO: implement render
    return Slider(value: value, onChanged: onChanged);
  }
}
class IOSSlider implements ISlider {
  @override
  Widget render(double value, ValueSetter<double> onChanged) {
    // TODO: implement render
    return CupertinoSlider(value: value, onChanged: onChanged);
  }
}

Page中运用时 ,运用笼统类,而不是详细的实例

late IActivityIndicator _activityIndicator;
late ISlider _slider;
late ISwitch _switch;

因为代码的量较多,我就不逐个贴出了,假如感兴趣,可以自行下载本文的示例代码 flutter_design_patterns

假如觉得有收获请按如下方法给个 爱心三连::点个赞鼓舞一下。:保藏文章,方便回看哦!。:谈论交流,互相进步!