抽象工厂
抽象工厂的应用场景是这样的:我想做一个应用,该应用的界面上有一个button,一个textfield,一个date显示。。。。而button,textfield,和date控件都是由第三方类库提供。假如我们的button,textfield和date组件都是在我们的程序中直接实例化出来的。那我们的代码应该是
var button:AButton = new AButton();
button.lable = "点击我";
var textfield:ATextField = new ATextField();
textfield.setText("我是文本");
var dateField:ADateField = new ADateField();
dateField.setDate(date);
这样带来的麻烦是,假如我想换掉这三个组件,而他们的行为逻辑不变,那么我的代码中三个实例化的地方都需要更改。
var button:BButton = new BButton();
button.lable = "点击我";
var textfield:BTextField = new BTextField();
textfield.setText("我是文本");
var dateField:BDateField = new BDateField();
dateField.setDate(date);
这样修改的地方可能还不是很多,但是当界面的组件很多时。我们要修改的地方也随之增加。当你界面的东西多到让你为这种修改而头疼不已的时候,你是不是会想有没有更好的办法,让组件变化的时候,自己的代码里可以很少的变动呢?这时候抽象工厂就跑出来告诉你,他可以让你从这种痛苦的修改中解脱出来。具体的办法如下:
我来规定界面组件的行为:IButton
function set lable(value:String):void
ITextField
function setText(value:String):void
IDateField
function setDate(value:Date):void
然后定义一个IFactory
定义好
createButton():IButton
createTextfield():ITextfield
createDateField():IDateField
这样让第三方只要实现IFactory就可以为我生成可用组件
AFactory implements IFactory
public function createButton():IButton{ return new AButton();}
public function createTextfield():ITextfield{ return new ATextfield();}
public function createDateField():IDateField{ return new ADateField();}
BFactory implements IFactory
public function createButton():IButton{ return new BButton();}
public function createTextfield():ITextfield{ return new BTextfield();}
public function createDateField():IDateField{ return new BDateField();}
这样实现以后,我的代码就可以改成
var factory:IFactory = new AFactory();
var button:AButton = factory.createButton();
button.lable = "点击我";
var textfield:ATextField = factory.createTextfield();
textfield.setText("我是文本");
var dateField:ADateField = factory.createDateField();
dateField.setDate(date);
当我想换成B样式时,我仅需要改一下factory实例
var factory:IFactory = new BFactory();
var button:AButton = factory.createButton();
button.lable = "点击我";
var textfield:ATextField = factory.createTextfield();
textfield.setText("我是文本");
var dateField:ADateField = factory.createDateField();
dateField.setDate(date);
抽象工厂就这么让你基本不用修改代码,完成了一次复杂界面的转换。