模式学习(三)- 工厂模式

一: 一般的工厂模式

  

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();

 

 

posted @ 2013-12-24 17:52  楚玉  阅读(171)  评论(0编辑  收藏  举报