zoukankan      html  css  js  c++  java
  • 抽象工厂

    抽象工厂
    抽象工厂的应用场景是这样的:我想做一个应用,该应用的界面上有一个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:BDateField  = new BDateField();
    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);
    抽象工厂就这么让你基本不用修改代码,完成了一次复杂界面的转换。

    抽象工厂的应用场景是这样的:我想做一个应用,该应用的界面上有一个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);
    抽象工厂就这么让你基本不用修改代码,完成了一次复杂界面的转换。

  • 相关阅读:
    hide the navigationBar and tabBar
    js
    CATranstion动画
    CASpringAnimation
    UIImageView动画
    打电话发短信
    页面滑动悬停在某个控件(两种做法)
    导航栏相关设置
    ASCII和16进制
    C++中,申请字符串数组可用new实现
  • 原文地址:https://www.cnblogs.com/crkay/p/1779142.html
Copyright © 2011-2022 走看看