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

     

     

  • 相关阅读:
    bzoj 3876: [Ahoi2014&Jsoi2014]支线剧情【有上下界有源汇最小费用最大流】
    bzoj 2055: 80人环游世界【有上下界有源汇最小费用最大流】
    bzoj 2406: 矩阵【二分+有源汇上下界可行流】
    bzoj 4873: [Shoi2017]寿司餐厅【最大权闭合子图】
    bzoj 2007: [Noi2010]海拔【最小割+dijskstra】
    bzoj 2039: [2009国家集训队]employ人员雇佣【最小割】
    bzoj 3996: [TJOI2015]线性代数【最小割】
    bzoj 3158: 千钧一发【最小割】
    bzoj 2597: [Wc2007]剪刀石头布【最小费用最大流】
    bzoj 5120: [2017国家集训队测试]无限之环【最小费用最大流】
  • 原文地址:https://www.cnblogs.com/chuyu/p/3489478.html
Copyright © 2011-2022 走看看