设计模式——建造者模式

一、什么是建造者模式?

 

当一个对象的创建包含该对象的部件部分及部件的装配过程时,建造者模式可以将对象的部件生成过程及装配过程进行分离解耦,从而使系统结构变得更加清晰。举个栗子:我们知道电脑是由CPU,硬盘和内存组成的,那么如果我们要创建一个电脑,首先的思路就是我们去制造CPU、硬盘和内存,然后进行组装,这样就生成了一台电脑。仔细一想,这个模式存在很多问题,它将部件的生成和组装放在了一起,那么如果我现在要一台Dell电脑(Dell记得给广告费XD),那我需要制造Dell电脑的各种部件,然后组装。如果需要苹果的电脑,那么需要制造苹果的部件然后组装。这种模式一来使部件和组装的依赖太强,二来组装这个过程其实是可以拎出来独立,从而减少重复代码量的。


运用建造者模式就可以比较好地解决上述问题,建造者模式可以将复杂对象的构建过程和它的部件进行解耦。使用建造者模式,我们可以用Builder类负责部件的创建,Producer类负责产品的组装。具体见下文

 

二、建造者模式框图


我们通过买电脑这个例子来讲述下建造者模式在其中的应用。



我们可以看到这里的建造者模式中有以下几个角色:


1. 部件类:电脑部件的具体类,如CPU、硬盘及内存,这些类在创建的时候需要向构造方法中传入String类的model,即指定型号。


2. 具体的商品类:这里是Dell的电脑,表示Dell电脑是由哪些部件组成的,内部包含了部件类的引用。


3. 抽象的建造者:具体建造者的基类,其中规定了几个要被重写的接口方法。在本例中表示抽象的电脑制造商,负责生产各种电脑配件:CPU, RAM, Disk等


4. 具体的建造者:实现了抽象建造者接口。在本例中,表示Dell电脑的部件制造商。


5. 客户端:买电脑的人,指定了需要什么牌子的电脑。

 

三、建造者模式的具体代码

 

3.1 部件类,包含CPU、Disk、RAM

public class CPU {


    private String model;

    public CPU(String model){
        this.model = model;
    }

    public String getModel() {
        return model;
    }

    public void setModel(String model) {
        this.model = model;
    }

}

public class Disk {

    private String model;

    public Disk(String model){
        this.model = model;
    }

    public String getModel() {
        return model;
    }

    public void setModel(String model) {
        this.model = model;
    }
}

public class RAM {


    private String model;


    public RAM(String model){
        this.model = model;
    }


    public String getModel() {
        return model;
    }


    public void setModel(String model) {
        this.model = model;
    }
}

3.2 DellComputer类,具体电脑类

package designpatterns.builder;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Olive on 2017/12/14.
 * 电脑
 */
public class DellComputer {

    private CPU cpu;
    private Disk disk;
    private List<RAM> RAMList;

    public void generateCPU(CPU cpu) {
        this.cpu = cpu;
    }

    public void generateDisk(Disk disk) {
        this.disk = disk;
    }

    public void generateRAM(RAM RAM) {
        if (RAMList == null) {
            RAMList = new ArrayList<RAM>();
        }
        RAMList.add(RAM);
    }

    public void printConfiguration() {
        if (cpu == null || disk == null || RAMList == null) {
            System.out.println("Wait a  moment!");
        } else {
            System.out.println("This is a Dell computer with " + cpu.getModel()
                    + ", " + disk.getModel() + " and " + RAMList.size() + " RAM");
        }

    }
}

3.3 ComputerBuilder类,抽象的电脑建造者类

package designpatterns.builder;

/**
 * Created by Olive on 2017/12/14.
 * 电脑制造商,负责生产各种电脑配件:CPU,RAM,Disk等
 */
public interface ComputerBuilder {

    void buildCPU();
    void buildDisk();
    void buildRAM();

}

3.4 DellComputerBuilder类,具体的电脑部件建造者类

package designpatterns.builder;

/**
 * Created by Olive on 2017/12/14.
 * Dell电脑制造商,负责制造电脑各配件
 *
 */
public class DellComputerBuilder implements ComputerBuilder{

    private DellComputer dellComputer;

    public DellComputerBuilder(){
        dellComputer = new DellComputer();
    }

    public void buildCPU() {
        dellComputer.generateCPU(new CPU("Dell CPU"));
    }

    public void buildDisk() {
        dellComputer.generateDisk(new Disk("Dell Disk"));
    }

    public void buildRAM() {
        dellComputer.generateRAM(new RAM("Dell RAM1"));
        dellComputer.generateRAM(new RAM("Dell RAM2"));
    }

    // 生成Dell电脑配件
    public DellComputer getDellComputer(){
        //System.out.println("Now you get a dell dellComputer~");
        return dellComputer;
    }
}

3.5 Producer类,电脑经销商

package designpatterns.builder;

/**
 * Created by Olive on 2017/12/14.
 * 电脑经销商
 */
public class Producer {

    private ComputerBuilder builder;

    public Producer(ComputerBuilder builder){
        this.builder = builder;
    }

    // 经销商负责将电脑配件组装成电脑
    public void construct(){
        builder.buildCPU();
        builder.buildDisk();
        builder.buildRAM();
    }
}

3.6 Client类,客户端

package designpatterns.builder;

/**
 * Created by Olive on 2017/12/14.
 */
public class Client {

    public static void main(String[] args){

        // 让Dell电脑的制造商去制造各种配件
        DellComputerBuilder builder = new DellComputerBuilder();
        // 经销商完成组装工作
        Producer producer = new Producer(builder);
        producer.construct();
        // 最后就获得了一台Dell电脑
        DellComputer dellComputer = builder.getDellComputer();
        dellComputer.printConfiguration();
    }
}

3.7 结果

This is a Dell computer with Dell CPU, Dell Disk and 2 RAM

Process finished with exit code 0


四、一点小总结

 

  使用建造者模式是很方便的,上面的例子中我们买了一台Dell的电脑,如果我们想要Mac,那么我们就告诉电脑经销商我们需要Mac电脑及其配件即可,反映到代码层面我们需要重写一个MacComputer和MacComputerBuilder类即可。建造者模式和工厂模式有一定的相像,比较容易搞混。但是这两个模式在设计理念中有很大的不同,工厂模式在于解决产品的系列化生成,这些产品都是整体创建的;建造者更关注于复杂产品的细节创建,比如完成复杂产品的部件构建和最后的组装。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值