zoukankan      html  css  js  c++  java
  • JS工厂模式

    什么是工厂模式?

    工厂模式是一种用来创建对象的设计模式。我们不暴露对象创建的逻辑,而是将逻辑封装在一个函数内,那么这个函数可以成为工厂。工厂模式根据抽象程度的不同可以分为:1.简单工厂 2.工厂方法 3.抽象工厂

    1.简单工厂:

    let  factory = function (role) {
    function superman() {
        this.name ='超级管理员',
        this.role = ['修改密码', '发布消息', '查看主页']
    }
    
    function commonMan() {
        this.name = '普通游客',
        this.role = ['查看主页']
    }
    
    switch(role) {
        case 'superman':
        return new superman();
        break;
        case 'man':
        return new commonMan();
        break;
        default:
        throw new Error('参数错误')
    }
    
    }
    
    let superman = factory('superman');
    let man = factory('man');

    在上述代码中,factory就是一个简单的工厂,该工厂中有二个构造函数分别对应不同的权限。我们只需要传递相应的参数就可以获取一个实例对象了。工厂内部的构造函数有相似的地方,还可以进一步优化。

    let  factory = function (role) {
    function User(obj) {
        this.name = obj.name;
        this.role = obj.role;
    }
    switch(role) {
        case 'superman':
        return new User({ name: '平台用户', role: ['主页', '登录页'] })
        break;
        case 'man':
        return new User({ name: '游客', role: ['登录页']})
        break;
        default:
        throw new Error('参数错误')
    }
    }
    
    let superman = factory('superman');
    let man = factory('man');

    简单工厂的优点: 你只需要传递一个合法的参数,就可以获取到你想要的对象,而无需知道创建的具体的细节。但是在函数内包含了所有对象的构造函数和判断逻辑的代码, 每次如果需要添加一个对象,那么我们需要新增一个构造函数,当我们需要维护的对象不是上面这2个,而是20个或者更多,那么这个函数将会成为超级函数,使得我们难以维护。所以简单工厂模式只适用于在创建时对象数量少,以及逻辑简单的情况。

    2.工厂方法:

    工厂方法模式本意是将实际创造的对象推迟到子类中,这样核心类就变成了抽象类。但是在js中很难像那些传统面向对象语言那样去实现抽象类,所以在js中我们只需要参考他的思想即可。

    我们可以把工厂函数看成是一个工厂类。在简单模式我们,我们添加一个新的对象需要修改二处地方,在加入工厂方法模式以后,我们只需要修改一处即可。工厂方法的工厂类,他只做实例化这一件事情。我们只需要修改他的原型类即可。我们采用安全模式创建工厂对象。

    let factory = function (role) {
        if(this instanceof factory) {
            var s = new this[role]();
            return s;
        } else {
            return new factory(role);
        }
    }
    
    factory.prototype = {
        admin: function() {
            this.name = '平台用户';
            this.role = ['登录页', '主页']
    
        },
        common: function() {
            this.name = '游客';
            this.role = ['登录页']
        },
        test: function() {
            this.name = '测试';
            this.role =  ['登录页', '主页', '测试页'];
            this.test = '我还有一个测试属性哦'
        }
    }
    
    let admin = new factory('admin');
    let common = new factory('common');
    let test = new factory('test');

    在上述代码中要是忘记加new了, 那么我们就获取不到admin,common等对象了,使用安全模式可以很好的解决这个问题。

  • 相关阅读:
    POJ 3710 Christmas Game#经典图SG博弈
    POJ 2599 A funny game#树形SG(DFS实现)
    POJ 2425 A Chess Game#树形SG
    LeetCode Array Easy 122. Best Time to Buy and Sell Stock II
    LeetCode Array Easy121. Best Time to Buy and Sell Stock
    LeetCode Array Easy 119. Pascal's Triangle II
    LeetCode Array Easy 118. Pascal's Triangle
    LeetCode Array Easy 88. Merge Sorted Array
    ASP.NET MVC 学习笔记之 MVC + EF中的EO DTO ViewModel
    ASP.NET MVC 学习笔记之面向切面编程与过滤器
  • 原文地址:https://www.cnblogs.com/xiaogua/p/10502892.html
Copyright © 2011-2022 走看看