设计模式(1)工厂模式

设计模式有 23 种,按大类分的化可以分为三类

  • 创建型(如:工厂模式、单例模式、原型模式等)
  • 结构模式型(如:装饰器模式、代理模式)
  • 行为型(如:观察者、迭代器模式等)

工厂模式又分为:工厂方法模式、抽象工厂模式、简单工厂模式

简单工厂模式

我们从最简单的开始。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例

类图:苹果和梨都是继承植物



代码

class Plant {
  constructor(name) {
    this.name = name
  }
  grow() {
    console.log('我有生长功能哦~~')
  }
}

class Apple extends Plant {
  constructor(name, color) {
    super(name)
    this.color = color
  }
}

class Pear extends Plant {
  constructor(name, color) {
    super(name)
    this.color = color
  }
}

new Apple('苹果', '红色')
new Pear('梨子', '黄色')

// 经典案例 jQuery
class jQuery {
  constructor(selector) {
    let elems = Array.from(document.querySelectorAll(selector))
    let length = elems ? elems.length : 0

    for (let i = 0; i <= length; i++) {
      this[i] = elems[i]
    }
    this.length = length
  }
  html() {

  }
}

window.$ = function (selector) {
  return new jQuery
}

工厂模式的好处在于, 我们可以不动原逻辑的基础上, 继承和扩展新的功能, 这样我们就可以提高效率, 之前大神写的代码可以复用, 而且可以站在巨人的肩膀上, 不断扩展。 当然, 其实这些你们平时应该都有写过或者用过, 只是现在由一个名词规范起来, 是不是觉得突然高大尚了。 上面代码直接new 的缺点是, 耦合和依赖于具体的实现。

工厂模式方法

同先上一个类图, 需求变了需要添加个橘子:



上代码:

class Plant {
  constructor(name) {
    this.name = name
  }

  grow() {
    console.log('growing~~')
  }
}

class Apple extends Plant {
  constructor(name, color) {
    super(name)
    this.color = color
  }
}

class Orange extends Plant {
  constructor(name, color) {
    super(name)
    this.color = color
  }
}

class AppleFactory {
  create() {
    return new Apple('苹果', '红色')
  }
}

class OrangeFactory {
  create() {
    return new Orange('橙子', '橙色')
  }
}

const settings = {
  'apple': AppleFactory,
  'orange': OrangeFactory
}
let apple = settings['apple']().create()
let orange = settings['orange']().create()

这样写的好处我们可以随意添加不同的水果,我们不用关心如何实现,新增一个水果类,拿来用就好,还有一个好处就是,假如AppleFactory 有改动新增新的功能,但是引用的地方很多,我们只需要新增一个 AppleFactory,修改不影响老代码

抽象工厂模式

抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式 抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象.

为了好展示我们来举个例子:比如现在用java来写个软件要运行在不同系统window、mac等,但是他们的icon和button是不同的
类图


class Factory {
    // 公共的方法是有一定的关联
    createButton() {//创建按钮
    }
    createIcon() {// 创建图标
    }
}
class Icon { }
class AppleIcon {
    render() {
        console.log(`绘制苹果图标`)
    }
}
class WindowsIcon {
    render() {
        console.log(`绘制window图标`)
    }
}
class Button { }
class AppleButton {
    render() {
        console.log(`绘制苹果按钮`)
    }
}
class WindowsButton {
    render() {
        console.log(`绘制windows按钮`)
    }
}
class AppleFactory extends Factory {
    createButton() {//创建按钮
        return new AppleButton();
    }
    createIcon() {// 创建图标
        return new AppleIcon();
    }
}
class WindowsFactory extends Factory {
    createButton() {//创建按钮
        return new WindowsButton();
    }
    createIcon() {// 创建图标
        return new WindowsIcon();
    }
}
/**
 * Java是跨平台的
 * 1.画一个图标
 * 2.画一个按钮
 */
let windowsFactory = new WindowsFactory();
windowsFactory.createIcon().render();
windowsFactory.createButton().render();
//=========================================
let appleFactory = new AppleFactory();
appleFactory.createIcon().render();
appleFactory.createButton().render();

小结

  1. 简单工厂 一般就是一个函数返回产品的实例 (最常用,使用最多)
  2. 工厂方法 多了工厂类,要想创建产品,需要先创建此工厂的实例,再通过此工厂来创建产品。(少用)
  3. 在抽象工厂中,一个工厂可以创建多种产品 (基本不用) 看到这里了,你们的点赞是我动力~~

补充知识点-类图

  • 用于描述系统中的对象类本身的组成和对象类之间的各种静态关系
  • 类之间的关系:依赖、泛化(继承)、 实现、关联、聚合和组合 这里主要讲类图的依赖、泛化(继承)

依赖关系(Dependence)

只要在类中用到了对方,那么它们之间就存在依赖关系,如果没有对方,连编译都通过不了, 通俗的说就是 比如 动物 依赖于水和空气,下面为类图: 由三部分组成,类的名字、类的属性、类的方法。 依赖关系由虚线空心箭头表示


泛化关系(Generalization)

泛化关系实际上就是继承关系,他就是依赖关系的特例, 泛化关系由实线空心箭头表示


参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容