设计模式-建造者模式

建造者模式是创建复杂对象时使用。

工厂模式,只是创建对象实例,但是并没有给对象实例赋值,比如创建Student实例,但是并没有给Student实例的属性(name,age,classz)等赋值,建造模式实际上就是在实例化对象同时给对象的属性赋值的过程。

例如Bike对象实例包含属性(轮胎,颜色,定位GPS), 但是OFO和摩拜都属于自行车,我们需要根据厂商的需求制造OFO和摩拜两种车型(也就是给属性赋值不同的属性)。

建造者模式的UML主要包含;

实体对象(具体产品):

具体的建造者(实现建造接口规范,持有实体对象):

建造者接口规范(定义各个部件的构建方法,定义返回的产品类型):

制造者(指挥者):

如图:

 

 

 这里举例一个电脑的组装过程,电脑都具有属性(CPU,内存,磁盘),但是根据电脑具体的产品,我们可以制造ThinkPad,Mac等不同型号

首先定义具体产品:

package com.wehaicao.design;

import lombok.Data;

import java.io.Serializable;


/**
 * 建造的实体对象
 */
@Data
public class Computer implements Serializable {

    private String cpu ;
    private String memory ;
    private String disk ;
}

定义创建接口规范:

package com.wehaicao.design;

/**
 * 定义对象创建规范
 */
public interface IBuilder {
void buildCpu();

    void buildMemory();

    void buildDisk();

    Computer getComputer();
}

定义ThinkPad的创建过程:

package com.wehaicao.design;

/**
 * 联想电脑创建实现
 */
public class ThinkPadComputer implements IBuilder {

    Computer computer = null ;
    public ThinkPadComputer() {
        computer = new Computer();
    }

    @Override
    public void buildCpu() {
        computer.setCpu("这是thinkPad 的CPU");
    }

    @Override
    public void buildMemory() {
        computer.setMemory("这是thinkPad 的Memory");
    }

    @Override
    public void buildDisk() {
        computer.setDisk("这是thinkPad 的Disk");
    }

    @Override
    public Computer getComputer() {
        return computer;
    }
}

 

定义MacBook 的创建过程

package com.wehaicao.design;

/**
 * @Author: WenQ
 * @Date: 2019/4/10
 * @Description: Mac电脑构建
 */
public class MacComputer implements IBuilder {
    Computer computer = null ;
    public MacComputer() {
        computer = new Computer();
    }

    @Override
    public void buildCpu() {
        computer.setCpu("MacComputer 装配CPU");
    }

    @Override
    public void buildMemory() {
        computer.setMemory("MacComputer 装配内存");
    }

    @Override
    public void buildDisk() {
        computer.setDisk("MacComputer 装配磁盘");
    }

    @Override
    public Computer getComputer() {
        return computer;
    }
}

 

从现在已有代码,我们可以看出如果我们想要造一个MacBook,我们只需要调用MacBook 的buildCpu,buildMemory,bulidDisk,最后调用getComputer方法返回具体产品即可获取MacBook

同理,我们要制造ThinkPad,我们需要调用ThinkPad 的buildCpu,buildMemory,bulidDisk,最后调用getComputer方法返回具体产品即可获取ThinkPad .

那我们此时如果对制造过程做一个抽象,只需要要传入Ibuider接口实例,抽象方法帮我们对各个属性赋值不是更好么,所以:

就有了指挥者:

package com.wehaicao.design;

/**
 * @Author: WenQ
 * @Date: 2019/4/10
 * @Description: 指挥者,负责对象的创建过程
 */
public class Director {

    public Computer createComputer(IBuilder abstactBuilder){
        abstactBuilder.buildCpu();
        abstactBuilder.buildDisk();
        abstactBuilder.buildMemory();
        return abstactBuilder.getComputer();
    }
}

自此,我们的假造者模式已经完成。如果需要MacBook,我们只需要new一个空的MacBook传递给Director实例的createComputer即可。

测试代码如下:

package com.wehaicao.design;

/**
 * @Author: WenQ
 * @Date: 2019/4/10
 * @Description:
 */
public class Test {
    public static void main(String[] args) {
        Director director = new Director();
        Computer computer = director.createComputer(new MacComputer());
        Computer computer1 = director.createComputer(new ThinkPadComputer());
        System.out.println(computer1);
        System.out.println(computer);
    }
}

运行结果如下:

 

posted on 2019-04-11 09:41  WenQ001  阅读(145)  评论(0编辑  收藏  举报