zoukankan      html  css  js  c++  java
  • javascript设计模式-工厂模式(简单工厂)

    接口在工厂模式中起着很重要的作用,如果不对对象进行某种类型检查的以确保其实现了必要的方法,工厂模式的好处也就所剩无几了,举个简单的例子。

    Interface.js

     1 // Constructor.
     2 
     3 var Interface = function(name, methods) {
     4     if(arguments.length != 2) {
     5         throw new Error("Interface constructor called with " + arguments.length
     6           + "arguments, but expected exactly 2.");
     7     }
     8     
     9     this.name = name;
    10     this.methods = [];
    11     for(var i = 0, len = methods.length; i < len; i++) {
    12         if(typeof methods[i] !== 'string') {
    13             throw new Error("Interface constructor expects method names to be " 
    14               + "passed in as a string.");
    15         }
    16         this.methods.push(methods[i]);        
    17     }    
    18 };    
    19 
    20 // Static class method.
    21 
    22 Interface.ensureImplements = function(object) {
    23     if(arguments.length < 2) {
    24         throw new Error("Function Interface.ensureImplements called with " + 
    25           arguments.length  + "arguments, but expected at least 2.");
    26     }
    27 
    28     for(var i = 1, len = arguments.length; i < len; i++) {
    29         var interface = arguments[i];
    30         if(interface.constructor !== Interface) {
    31             throw new Error("Function Interface.ensureImplements expects arguments "   
    32               + "two and above to be instances of Interface.");
    33         }
    34         
    35         for(var j = 0, methodsLen = interface.methods.length; j < methodsLen; j++) {
    36             var method = interface.methods[j];
    37             if(!object[method] || typeof object[method] !== 'function') {
    38                 throw new Error("Function Interface.ensureImplements: object " 
    39                   + "does not implement the " + interface.name 
    40                   + " interface. Method " + method + " was not found.");
    41             }
    42         }
    43     } 
    44 };
    View Code

    声明一个接口Bicycle,定义该接口应该有哪些方法

    1 var Bicycle = new Interface("Bicycle",["assemble","wash","ride","repair"]);

    构造一个简单的工厂BicycleShop,根据传递的模型,卖出不同类型的自行车。

     1 var BicycleShop  = function(){};
     2     
     3     BicycleShop.prototype = {
     4         sellBicycle:function(model){
     5             var bicycle;
     6             switch(model){
     7                 case "The Speedster":
     8                     bicycle = new Speedster();
     9                     break;
    10                 case "The Lowrider":
    11                     bicycle = new Lowrider();
    12                     break;
    13                 case "The Comfort Cruiser":
    14                 default:
    15                     bicycle = new ComfortCruiser();
    16             }
    17             Interface.ensureImplements(bicycle,Bicycle);
    18             bicycle.assemble();
    19             bicycle.wash();
    20             return bicycle;
    21         }
    22     }

    建立一个Speedster类型的自行车,且该类提供了必要的方法

     1 var Speedster = function(){
     2     };
     3     Speedster.prototype = {
     4         assemble:function(){
     5             console.log("assemble method is exected");
     6         },
     7         wash:function(){
     8             console.log("wash method is exected");
     9         },
    10         ride:function(){
    11             console.log("ride method is exected");
    12         },
    13         repair:function(){
    14             console.log("repair method is exected");
    15         }
    16     }

    创建一个工厂,传入模型参数

    1 var californiaCruisers = new BicycleShop();
    2 californiaCruisers.sellBicycle("The Speedster");

    结果:

     然而,如果需要加入一款新车型,那么必须为此修改BicycleShop代码,哪怕这个类的实际功能并没有发生变化。因此,更好的解决办法是把SellBicycle中的方法中创建实例的这部分交给一个简单的工厂。

     1 var BicycleFactory = {
     2         createBicycle:function(model){
     3             var bicycle;
     4             switch(model){
     5                 case "The Speedster":
     6                     bicycle = new Speedster();
     7                     break;
     8                 case "The Lowrider":
     9                     bicycle = new Lowrider();
    10                     break;
    11                 case "The Comfort Cruiser":
    12                 default:
    13                     bicycle = new ComfortCruiser();
    14             }
    15             Interface.ensureImplements(bicycle,Bicycle);
    16             return bicycle;
    17         }
    18     }
    19 
    20     var BicycleShop  = function(){};
    21     
    22     BicycleShop.prototype = {
    23         sellBicycle:function(model){
    24             var bicycle = BicycleFactory.createBicycle(model);
    25             bicycle.assemble();
    26             bicycle.wash();
    27             return bicycle;
    28         }
    29     }
  • 相关阅读:
    CodeForces 785D Anton and School
    CodeForces 785C Anton and Fairy Tale
    CodeForces 785B Anton and Classes
    CodeForces 785A Anton and Polyhedrons
    爱奇艺全国高校算法大赛初赛C
    爱奇艺全国高校算法大赛初赛B
    爱奇艺全国高校算法大赛初赛A
    EOJ 3265 七巧板
    EOJ 3256 拼音魔法
    EOJ 3262 黑心啤酒厂
  • 原文地址:https://www.cnblogs.com/tengri/p/5294354.html
Copyright © 2011-2022 走看看