设计模式之建造者模式
建造者模式
与工厂模式的区别
- 工厂模式注重创建对象的整体思路,不关心你想要创建的对象是什么样的。
- 建造者模式注重创建对象的细节,善于创建复杂对象或者复合对象。
需求
- 比如有一家招聘中介公司,现在有一批纸质简历或者建立数据信息,为了做成统一的电子版简历,我们需要将这些信息进行整理。
const data = [{
name: 'zhang san',
age: 23,
work: 'engineer'
}, {
name: 'li si',
age: 24,
work: 'teacher'
}, {
name: 'wang wu',
age: 25,
work: 'xxx'
}];
function Candidata(param) {
const _candidata = {};
_candidata.wholeName = param.name;
_candidata.name = param.name;
_candidata.age = param.age;
_candidata.firstName = param.name.split(' ')[0];
_candidata.secondName = param.name.split(' ')[1];
_candidata.work = {};
switch (param.work) {
case 'engineer':
_candidata.work.name = '工程师';
_candidata.work.description = '热爱编程';
case 'teacher':
_candidata.work.name = '老师';
_candidata.work.description = '乐于分享';
default:
_candidata.work.name = param.work;
_candidata.work.description = '无';
}
_candidata.work.changeWork = function(work) {
this.name = work;
}
_candidata.work.changeDes = function(des) {
this.name = work;
}
return _candidata
}
const candidataArr = data.map(item => Candidata(item));
console.log(candidataArr[0]);
建造者模式
const data = [{
name: 'zhang san',
age: 23,
work: 'engineer'
}, {
name: 'li si',
age: 24,
work: 'teacher'
}, {
name: 'wang wu',
age: 25,
work: 'xxx'
}];
function Candidata(param) {
let _candidata = new Person(param);
_candidata.name = new CreateName(param.name);
_candidata.work = new CreateWork(param.work);
return _candidata;
}
function Person(param) {
this.wholeName = param.name;
this.name = param.name;
this.age = param.age;
}
function CreateName(name) {
this.firstName = name.split(' ')[0];
this.secondName = name.split(' ')[1];
}
function CreateWork(work) {
switch (work) {
case 'engineer':
this.name = '工程师';
this.description = '热爱编程';
break;
case 'teacher':
this.name = '老师';
this.description = '乐于分享';
break;
default:
this.name = work;
this.description = '无';
}
}
const candidataArr = data.map(item => Candidata(item));
console.log(candidataArr[0])
建造者模式进行了再一次的抽象和封装,创造出了复杂或者复合形的对象结构,使代码变得清晰。
class 重写
const data = [{
name: 'zhang san',
age: 23,
work: 'engineer'
}, {
name: 'li si',
age: 24,
work: 'teacher'
}, {
name: 'wang wu',
age: 25,
work: 'xxx'
}];
class Candidata {
constructor(param) {
let _candidata = new Person(param);
_candidata.name = new CreateName(param.name);
_candidata.work = new CreateWork(param.work);
return _candidata;
}
}
class Person {
constructor(param) {
this.name = param.name;
this.age = param.age;
}
}
class CreateName {
constructor(name) {
this.wholeName = name;
this.firstName = name.split(' ')[0];
this.secondName = name.split(' ')[1];
}
}
class CreateWork {
constructor(work) {
switch (work) {
case 'engineer':
this.name = '工程师';
this.description = '热爱编程';
break;
case 'teacher':
this.name = '老师';
this.description = '乐于分享';
break;
default:
this.name = work;
this.description = '无';
}
}
}
const candidataArr = data.map(item => new Candidat(item));
console.log(candidataArr[0])
本文来自博客园,作者:懒惰ing,转载请注明原文链接:https://www.cnblogs.com/landuo629/p/14321831.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?