abstract factory(笼统工厂)
形式:提供一些创立相似目标或许归于同一类目标的接口
,而不是详细的实例。
形式结构
经过笼统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
。
示例代码
接下来,经过示例来体验这种设计形式。我们将经过单选框的选中和非选中,来切换iOS
和Android
两种不同风格的组建展现。
完成效果如下图
首要创立三个用于渲染组件的笼统类: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
假如觉得有收获请按如下方法给个
爱心三连
::点个赞鼓舞一下
。:保藏文章,方便回看哦!
。:谈论交流,互相进步!
。