设计模式之建造者模式

建造者模式

与工厂模式的区别

  • 工厂模式注重创建对象的整体思路,不关心你想要创建的对象是什么样的。
  • 建造者模式注重创建对象的细节,善于创建复杂对象或者复合对象。

需求

  • 比如有一家招聘中介公司,现在有一批纸质简历或者建立数据信息,为了做成统一的电子版简历,我们需要将这些信息进行整理。
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])

posted @ 2021-01-24 18:39  懒惰ing  阅读(87)  评论(0编辑  收藏  举报