介绍

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

    示例

  • 你去购买汉堡,直接点餐、取餐,不会自己亲手做

  • 商店要“封装”做汉堡的工作,做好直接给买者

    常见使用场景

  • 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; i++) {
      1. this[i] = dom[i];
      } this.length = len; this.selector = selector || “”; } append(node) {} addClass(name) {} html(data) {} // coding… } window.$ = function (selector) { return new jQuery(selector); };

// test var $p = $(“p”); console.log($p); console.log($.addClass);

  1. - React.createElement
  2. ```javascript
  3. // jsx语法
  4. var profile = (
  5. <div>
  6. <img src="avatar.png" className="profile" />
  7. <h3>{[user.firstName, user.lastName].join("")}</h3>
  8. </div>
  9. );
  10. // react手写dom
  11. var profile = React.CreateElement(
  12. "div",
  13. null,
  14. React.CreateElement("img", { src: "avatar.png", className: "profile" }),
  15. React.CreateElement("h3", null, [user.firstName, user.lastName].join(" "))
  16. );
  17. // react内部代码
  18. class Vnode(tag, attrs, children) {
  19. // Coding...
  20. }
  21. React.CreateElement = function (tag, attrs, children) {
  22. return new Vnode(tag, attrs, children);
  23. };
  • vue异步组件 ```javascript Vue.component(“asycn-example”, function (reslove, reject) { setTimeout(function () {
    1. reslove({
    2. template: "<div>I am async!</div>",
    3. });
    }); });
  1. <a name="i9iMF"></a>
  2. # 工厂模式代码示例
  3. ```javascript
  4. class Product {
  5. constructor(name) {
  6. this.name = name;
  7. }
  8. init() {
  9. alert("init");
  10. }
  11. fun1() {
  12. alert("fun1");
  13. }
  14. fun2() {
  15. alert("fun2");
  16. }
  17. }
  18. class Creator {
  19. create(name) {
  20. return new Product(name);
  21. }
  22. }
  23. // test
  24. let creator = new Creator();
  25. let p = creator.create("p1");
  26. p.init();
  27. p.fun1();

总结

工厂模式主要用在需要频繁创建新对象的时候,以及多处需要创建新对象的时候。
使用工厂模式可以避免类名改动造成需要大量修改代码的情况