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);
    抽象工厂就这么让你基本不用修改代码,完成了一次复杂界面的转换。

  • 相关阅读:
    【学习笔记】查看CUDA版本
    如果Visual Studio太大,不妨还是用VSCode开发C#项目吧
    Visual Studio npm配置淘宝镜像
    c++读写锁--读者写者问题
    c++内存对象模型--vs2017下的分析,32位
    android作业
    android连接数据库
    android第十周(增删改查)
    android-购物车
    android计算器
  • 原文地址:https://www.cnblogs.com/crkay/p/1779142.html
Copyright © 2011-2022 走看看