zoukankan      html  css  js  c++  java
  • 模式学习(三)- 工厂模式

    一: 一般的工厂模式

      

    function createPerson(name, age, job){
        var o = new Object();
        o.name = name;
        o.age = age;
        o.job = job;
        return o;  
    }
    var p1 = new createPerson("nick", 90, "doctor");

    二: 

        function Create(){}
        Create.factory = function(childOperation){
            return new Create[childOperation];
        };
        Create.Link = function(){
            this.setName = function(name){
                this.name = name;    
            };
            this.getName = function(){
                console.log(this.name);
            };
        };
    
        Create.Another = function(){
            this.console = function(){
                console.log("每颗心都寂寞");
            };
        };
    
        var p1 = Create.factory("Link");
        p1.setName("Nick");
        p1.getName();// "Nick"
    
        var p2 = Create.factory("Another");
        p2.console();// 每颗心都寂寞

     

    说明:

    工厂模式定义一个用于创建对象的接口(factory函数提供接口,然后 return new XXX...) 该模式使一个类的实例化延迟到了子类。而子类可以重写接口方法以便创建的时候指定自己的对象类型。

    这里的 Create.Link  就是子类,可以定义很多个跟他一样的子类,然后在里面定义不同的类,来创造不同的对象。

    下面是一个更完整的例子:

        // 父构造函数
        function CarMaker(){}
    
        // a method of parent
        CarMaker.prototype.drive = function(){
            console.log("Vroom, I have " + this.doors + " doors");
        };
    
        // 静态工厂方法
        CarMaker.factory = function(type){
            var constr = type,
                newcar;
    
            // 如果构造函数不存在,则发生错误
            if(typeof CarMaker[constr] !== "function"){ // CarMaker[Compact]存在 且 this.doors = 4;
                throw{
                    name : "Error",
                    message : constr + " doesn't exist"
                };
            }
    
            // 在这里,构造函数是已知存在的
            // 我们使得原型继承父类,但仅继承一次
            if(typeof CarMaker[constr].prototype.drive !== "function"){ // CarMaker[Compact].prototype.drive
                console.log("CarMaker[constr].prototype.drive 不存在 要new 一个");
                CarMaker[constr].prototype = new CarMaker();// CarMaker[Compact].prototype = new CarMaker(); 
            }
            // 创建一个新的实例
            newcar = new CarMaker[constr]();// 继承了CarMaker
            // 可选择的调用一些方法然后返回
            return newcar;
        };
    
        // 定义特定的汽车制造商
        CarMaker.Compact = function(){
            this.doors = 4;
        };
    
        CarMaker.Convertible = function(){
            this.doors = 2;
        };
    
        CarMaker.SUV = function(){
            this.doors = 24;
        };
    
        var corolla = CarMaker.factory('Compact');
        var solstice = CarMaker.factory('Convertible');
        var cherokee = CarMaker.factory('SUV');
    
        corolla.drive();
        solstice.drive();
        cherokee.drive();

     

     

  • 相关阅读:
    python学习,day4:装饰器的使用示例
    python学习,day3:函数式编程,递归和高阶函数
    JZ高中OJ 1385. 直角三角形
    JZ高中OJ 1382. 区间
    JZ高中OJ 3404. [NOIP2013模拟]卡牌游戏
    JZ高中OJ 3403. [NOIP2013模拟] 数列变换
    JZ高中OJ 1433. 数码问题
    JZ初中OJ 1339. disease
    JZ高中OJ 1432. 输油管道
    JZ初中OJ 1342. [南海2009初中]cowtract
  • 原文地址:https://www.cnblogs.com/chuyu/p/3489478.html
Copyright © 2011-2022 走看看