设计模式:创建型-工厂模式之简单工厂

Posted 辛月久

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式:创建型-工厂模式之简单工厂相关的知识,希望对你有一定的参考价值。

设计模式的核心操作是观察你整个逻辑里面的变与不变,然后将变与不变分离,达到使变化的部分灵活,不变的地方稳定的目的。


先来说说构造器


在介绍工厂模式之前,为了辅助理解,先介绍一下构造器模式。


有一天你写了个公司员工信息输入系统,这个系统开发阶段用户只有你自己,想怎么玩就怎么玩,于是在创建用户的时候你可以这么写:

const lilei = {  name'李雷', age: 25,  career'coder'}

有一天你的同桌韩梅梅突然说:“李雷,你让我瞅瞅你的系统做的咋样了,我也想被录进去”。你说好,不就多了一个人的事情吗,于是代码里手动多了一个韩梅梅:

const hanMeiMei = {  name: '韩梅梅', age: 25, career: 'coder'}

又过了两天你老板过来了,说李雷,系统今天提测了,先把部门500人录入试试看。李雷心想,500个对象字面量,要死要死,还好我有构造函数。于是李雷写出了一个可以自动创建用户User的函数:

function User (name, age, career) { this.name = name this.age = age  this.career = career}

这个User就是一个构造器,就是让程序自动读取数据库里面一行行的员工信息,然后把拿到的姓名,年龄等字段塞进User函数里,进行一个简单的调用。

const user = new Usr(name, age, career)

那么问题来了,在创建User的过程中,谁变了,谁不变?


很明显,变的是每个User的姓名,年龄,工种这些值,这是用户的个性,不变的是每个员工都具备姓名,年龄,工种这些属性,这是用户的共性。


那么构造器做了什么?


构造器将赋值的过程封装,保证了共性的稳定不变,同时将各个属性的取值操作放开,确保了个性的灵活。


简单工厂模式


先说定义,简单工厂模式又称静态工厂模式,作用就是创建一个工厂类来创建其他类的实例,至于类是怎么创建的对用户来说不可见。


还是上面例子,老板说这个系统太简单了,程序员和产品经理之间的区别一个简单的career字段怎么能说的清?要给每个工种的用户加上一个个性化的字段,来描述他们的工作内容。


完了,这下员工的共性被拆离了。还好有构造器,李雷心想不就是多写个构造器的事儿吗,我写:

function Code (name, age) { this.name = name this.age = age this.career = 'code'  this.work = ['code','test']}function ProductManager(name, age) { this.name = name this.age = age  this.career = 'pm'  this.work = ['订会议室''写PRD']}

现在我们有两个类(后面可能还有更多的类),麻烦的事情来了:难道每从数据库拿来一条数据,我都要先判断一下这个员工的工种,然后再分配构造器吗?不行,这也是个“变”,我们把这个“变”交给一个函数处理:

function Factory(name, age, carrer) {  switch(career){   case: 'code':      return new Coder(name, age);      break;    case: 'pm'      return new ProductManager(name, age);      break;      ...  } }

看起来是好了些,但是看到后面的省略号,李雷哭了,公司有二三十个工种,难道我要写二三十个构造函数?二三十行switch?


当然不,继续思考上面这段代码,变的是什么,不变的又是什么?


现在我们把相同的逻辑封装回User类里,然后把这个承载了共性的 User 类和个性化的逻辑判断写入同一个函数:

function User(name, age, career, work){  this.name = name  this.age = age  this.career = career  this.work = work}function Factory(name, age, career) {  let work  switch (career){   case: 'coder':   work = ['code','test']   break;    case: 'pm':      work = ['订会议室''写PRD''催更']      break; case 'boss':      work = ['喝茶''看报''见客户'] case 'xxx':      // 其它工种的职责分配     ...  }  return new User(name, age, career, work)}

这样是不是就简单多了。


小结


工厂模式的简单之处在于它的概念好理解:将创建对象的过程单独封装,这样的操作就是工厂模式。同时它的应用场景也非常容易识别:有构造函数的地方,我们就应该想到简单工厂。在写了大量的构造函数,调用了大量的new,在自己都感觉不爽的时候,我们就应该思考是不是可以掏出工厂模式重构我们的代码了!


但工厂模式不止这一种表达方式。上面我们可以看到,构造器解决了多个对象实例的问题,简单工厂解决了多个构造函数的问题。那么复杂度上升,多个工厂并存时又该怎么处理呢?下篇我会写到。


以上~~~


以上是关于设计模式:创建型-工厂模式之简单工厂的主要内容,如果未能解决你的问题,请参考以下文章

设计模式从青铜到王者第五篇:创建型模式之简单工厂模式( Simple Factory Pattern )

设计模式之创建型简单工厂模式

5创建型模式之简单工厂模式

创建型模式之工厂模式

设计模式之简单工厂模式(创建型)

设计模式之简单工厂模式(创建型)