Skip to content
On this page

工厂模式

介绍

  • 将 new 操作单独封装
  • 遇到 new 时,就要考虑是否该使用工厂模式

示例

  • 你去购买汉堡,直接点餐、取餐,不会自己亲手做
  • 商店要“封装”做汉堡的工作,做好直接给买者

传统 UML 类图

简化 UML 类图

JavaScript 代码演示

javascript
class Product {
    constructor(name) {
        this.name = name
    }
    init() {
        alert('init')
    }
    fun1() {
        alert('fun1')
    }
    fun2() {
        alert('fun2')
    }
}

class Creator {
    create(name) {
        return new Product(name);
    }
}
// 测试
let creator = new Creator();
let p = creator.create('p1');
p.init()
p.fun1()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

JQuery

$('div'), 和 new $('div') 有何区别

  • 第一:书写麻烦,jQuery 的链式操作将成为噩梦
  • 第二:一旦 jQuery 名字变化,将是灾难性的
javascript
class jQuery {
    constructor(selector) {
        let slice = Array.prototype.slice;
        let dom = slice.call(document.querySelectorAll(selector));
        let len = dom ? dom.length : 0
        for (let i = 0; i < len; 1++) {
            this[i] = dom[i]
        }
        this.length = len;
        this.selector = selector;
    }
    append(node) {
        console.log(node);
    }
    addClass(name) {
        console.log(name);
    }
    html(data) {
        console.log(data);
    }
    // 此处省路若干 API
};

window.$ = function (selector) {
    return new jQuery(selector)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

设计原则验证

  • 构造函数和创建者分离
  • 符合开放封闭原则
沪ICP备20006251号-1