• 工厂模式——JavaScript


    我理解的设计模式是为了提高代码复用,增强扩展性的代码编写理念,所以无关乎编程语言。JavaSript是我感兴趣的语言,所以使用它来实现。

    • 简单工厂(Sample Factory)

    又叫静态工厂,用于创建同一类对象。如弹出框分为警告、确认和对话框,它们公共的方法提取出来,不同之处分别处理。

     1 function createPop(type,text){
     2      var o = new object();
     3      o.content = text;
     4      o.show = function(){
     5             //todo
     6      };
     7 
     8      if(type == 'alert'){
     9             //todo
    10      } else if(type == 'conform'){
    11             //todo
    12      } else if(type == 'prompt'){
    13             //todo
    14      }
    15 }        

    创建一个Alert:var nameAlert = new createPop('alert','请输入姓名!');

    • 工厂方法(Factory Method)

    工厂方法是将创建对象的方法推迟到子类中。如一个工厂方法可以生产几种食品类。

     1 var FoodFactory = function(type,count){
     2      if(this instanceof FoodFactory){
     3            return new this[type](count);
     4      }
     5 }
     6 
     7 FoodFactory.prototype = {
     8      Pie: function(count){
     9             //todo
    10      },
    11      Pizza: function(count){
    12             //todo
    13      },
    14      Cake: function(count){
    15             //todo
    16      }
    17 }

     

    •  抽象工厂(Abstract Factory)

    抽象类显示定义一些功能,但没有具体实现。子类继承了抽象类还需要实现各个虚方法。就是在其他面向对象语言里的多态,创建子类赋值给父类,好处是调用方式都是一样的,运行时会自动选择子类对应的方法。

    如一个汽车的公司有多个品牌,它只负责设计汽车有什么功能,但真正的生产给子公司实现。

     1 var VehicleFactory = function(subType,superType){  
     2      if(typeof VehicleFactory[superType] === 'function'){
     3            fucntion F(){};  //缓存类
     4            F.prototype = new VehicleFactory[super]();
     5            subType.constructor = subType;
     6            subType.prototype = new F(); 
     7      } else {
     8            throw new Error('未创建该抽象类');
     9      }
    10 }
    11 
    12 //抽象类
    13 VehicleFactory.Car = function(){
    14      this.type = 'Car';
    15 };
    16 
    17 VehicleFactory.Car.prototype = {
    18      getPrice:function(){
    19            return new Error('抽象方法不能调用');
    20      },
    21      // ...
    22 }
    23 
    24 //抽象类
    25 VehicleFactory.Truck= function(){
    26      this.type = 'Truck';
    27 };
    28 
    29 VehicleFactory.Truck.prototype = {
    30      getPrice:function(){
    31            return new Error('抽象方法不能调用');
    32      },
    33      // ...
    34 }
    35 
    36 //宝马子类
    37 var BMW = function(price,speed){
    38     this.price = price;
    39     this.speed = speed;
    40 };
    41 VehicleFactory(BMW,'Car'); //宝马继承了抽象父类Car,有了一些抽象方法,但是不能使用
    42 BMW.prototype.getPrice = function(){
    43     return this.price;
    44 }
    45 
    46 //使用
    47 var z4 = new BMW(50000);
    48 console.log(z4.type);        //Car      继承父类Car的属性
    49 console.log(z4.getPrice());  //50000 继承父类Car的抽象方法,自己重新实现

    抽象工厂做了什么?我们需要一个新的子类时,使用抽象工厂让子类继承对应的一个抽象类,得到一些属性和虚方法,子类再实现这些虚方法,就可以使用了。

    参考:

    张容铭《JavaScript设计模式》

  • 相关阅读:
    MySQL 查询树结构、循环查询、查看函数、视图、存储过程
    SpringBoot 部署:外置依赖包
    springboot集成docker实现自动化构建镜像说明
    Chrome谷歌浏览器常用快捷键、开发技巧
    Windows常用CMD命令
    Git 版本管理,与 SVN区别对比
    TensorFlow重新导入restore报错: OP_REQUIRES failed at save_restore_v2_ops.cc:184 : Not found: Key Variable not found in checkpoint
    MySQL字符集设置
    Hive 时间操作
    深度思考:如何规划你的职业生涯
  • 原文地址:https://www.cnblogs.com/feitan/p/5238137.html
Copyright © 2020-2023  润新知