zoukankan      html  css  js  c++  java
  • 什么是工厂模式?

    什么是工厂模式?

    //注,转载自https://www.cnblogs.com/xiaogua/p/10502892.html 

            工厂模式是一种用来创建对象的设计模式。我们不暴露对象创建的逻辑,而是将逻辑封装在一个函数内,那么这个函数可以成为工厂。

       工厂模式根据抽象程度的不同可以分为:1.简单工厂 2.工厂方法 3.抽象工厂

    简单工厂:

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

     

     

  • 相关阅读:
    webstrom 内存溢出,软件崩溃卡死解决的方法
    JAVA 基础 / 第八课:面向对象 / JAVA类的方法与实例方法
    JAVA 基础 /第七课: 面向对象 / JAVA类的属性,类变量与实例变量
    JAVA 基础 /第六课: 面向对象 / JAVA中的类和对象
    JAVA 基础 /第五课:ECLIPSE常见的使用技巧以及部分快捷键
    JAVA 基础 / 第四课:在ECLIPSE中运行第一个 JAVA 程序以及找不到类的问题
    JAVA 基础 /第三课:下载 ECLIPSE并使用ECIPSE创建第一个 JAVA PROJECT
    JAVA 基础 / 第二课:用命令行中编写第一个 JAVA 程序
    JAVA 基础 / 第一课:手把手教你做JDK环境变量配置
    Java swing中的keyListener使用事例
  • 原文地址:https://www.cnblogs.com/muouran/p/13744445.html
Copyright © 2011-2022 走看看