设计模式:创建型-工厂模式之简单工厂
Posted 辛月久
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式:创建型-工厂模式之简单工厂相关的知识,希望对你有一定的参考价值。
设计模式的核心操作是观察你整个逻辑里面的变与不变,然后将变与不变分离,达到使变化的部分灵活,不变的地方稳定的目的。
先来说说构造器
在介绍工厂模式之前,为了辅助理解,先介绍一下构造器模式。
有一天你写了个公司员工信息输入系统,这个系统开发阶段用户只有你自己,想怎么玩就怎么玩,于是在创建用户的时候你可以这么写:
const lilei = {
name: '李雷',
age: 25,
career: 'coder'
}
有一天你的同桌韩梅梅突然说:“李雷,你让我瞅瞅你的系统做的咋样了,我也想被录进去”。你说好,不就多了一个人的事情吗,于是代码里手动多了一个韩梅梅:
{ =
'韩梅梅', :
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,在自己都感觉不爽的时候,我们就应该思考是不是可以掏出工厂模式重构我们的代码了!
但工厂模式不止这一种表达方式。上面我们可以看到,构造器解决了多个对象实例的问题,简单工厂解决了多个构造函数的问题。那么复杂度上升,多个工厂并存时又该怎么处理呢?下篇我会写到。
以上~~~
以上是关于设计模式:创建型-工厂模式之简单工厂的主要内容,如果未能解决你的问题,请参考以下文章