[设计模式]建造者模式

不想你离开。 提交于 2020-01-17 15:29:07

目录

简介


建造者模式 (Builder)将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 

建造者模式是一种对象创建型模式 (可参考 设计模式 创建型模式)。 

使用建造者模式,用户就只需要指定需要建造的类型,具体的建造过程和细节并不需要知道。

 

结构


图-建造者模式结构图
Product : 产品类,由多个部件构成。
复制代码
class Product {
    List<String> parts = new ArrayList<String>();
    
    public void AddPart(String part) {
        parts.add(part);
    }
    
    public void show() {
        System.out.println("============== 产品创建 ==============");
        for (String part : parts) {
            System.out.println(part);
        }
    }
}
复制代码
Builder : 抽象建造者,确定产品由ABC三个部件构成,并声明一个得到产品建造后结果的方法getResult。
复制代码
interface Builder {
    public void buildPartA();
    public void buildPartB();
    public void buildPartC();
    public Product getResult();
}
复制代码
ConcreteBuilder : 实现Builder接口中的具体方法。
复制代码
class ConcreteBuilder implements Builder { 
    private Product product = new Product();
    
    @Override
    public void buildPartA() {
        product.AddPart("部件A");
    }

    @Override
    public void buildPartB() {
        product.AddPart("部件B");
    }
    
    @Override
    public void buildPartC() {
        product.AddPart("部件C");
    }

    @Override
    public Product getResult() {
        return product;
    }
}
复制代码
Director : 指挥者类,指挥建造Product的过程(控制构建各部分组件的顺序)。
复制代码
class Director {
    public void construct(Builder builder) {
        builder.buildPartC();
        builder.buildPartA();
        builder.buildPartB();
    }
}
复制代码
Client : 用户并不需要知道具体的建造过程,只需指定建造 Product 具体类型。
复制代码
public class BuilderPattern {
    public static void main(String[] args) {
        Director director = new Director();
        Builder builder = new ConcreteBuilder();
            
        director.construct(builder);
        Product product = builder.getResult();
        product.show();
    }
}
复制代码

运行结果

============== 产品创建 ==============
部件C
部件A
部件B

 

 

 

动机


创建一个复杂对象的算法,这个算法应当独立于对象的组成部分以及它们的装配方式。

构建过程必须允许构建对象时有不同的表示。

 

要点


建造者模式允许修改一个产品的内部表示。

它将构造和表示两块代码隔离开来。

它很好的控制了构建过程。

图-建造者模式时序图 

关键流程

客户端创建 Director 对象并配置它所需要的 Builder 对象。
Director 负责通知 builder 何时建造 product 的部件。
Builder处理 director 的请求并添加 product 的部件。
客户端从 builder 处获得 product。

实例


想象一下盖房子的场景。
一栋房子是由地基、墙、屋顶、门、窗各部分组合而成的。
盖房子需要有建筑工人负责建造,有工程师负责画建筑图纸。

House (Product角色)

复制代码
package com.zp.java.patterns.builder;

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

// Product角色,由多个部件构成
public class House {
    List<String> parts = new ArrayList<String>();
    
    public void addPart(String part) {
        parts.add(part);
    }
    
    public void show() {
        System.out.println("======= 房子展示 =======");
        for (String part : parts) {
            System.out.println(part);
        }
    }
}
复制代码

Builder

复制代码
package com.zp.java.patterns.builder;

// Builder角色 ,提供构建产品各部件的方法,并提供一个获得完整产品的方法。
public interface Builder {
    public void buildFoundation();
    public void buildWall();
    public void buildRoof();
    public void buildWindow();
    public void buildDoor();
    public House createHouse();
}
复制代码

Worker (ConcreteBuilder角色)

复制代码
package com.zp.java.patterns.builder;

// ConcreteBuilder角色,实现 Builder 接口中的具体方法。 
public class Worker implements Builder {
    private House house = new House();
    
    @Override
    public void buildFoundation() {
        house.addPart("地基");
    }

    @Override
    public void buildWall() {
        house.addPart("墙");
    }

    @Override
    public void buildRoof() {
        house.addPart("房顶");
    }

    @Override
    public void buildWindow() {
        house.addPart("窗户");
    }

    @Override
    public void buildDoor() {
        house.addPart("门");
    }

    @Override
    public House createHouse() {
        return house;
    }
}
复制代码

Engineer (Director角色)

复制代码
package com.zp.java.patterns.builder;

// Director角色,指挥构建产品的过程(控制构建顺序)
public class Engineer {
    public void conduct(Builder builder) {
        builder.buildFoundation();
        builder.buildWall();
        builder.buildRoof();
        builder.buildWindow();
        builder.buildDoor();
    }
}
复制代码

Client

客户无需了解具体的构造细节。

复制代码
package com.zp.java.patterns.builder;

public class Test {
    public static void main(String[] args) {
        Builder builder = new Worker();
        Engineer engineer = new Engineer();
        engineer.conduct(builder);
        House house = builder.createHouse();
        house.show();
    }
}
复制代码

运行结果

复制代码
======= 房子展示 =======
地基

房顶
窗户
复制代码

 

推荐阅读


本文属于 设计模式系列 。

 

参考资料


《大话设计模式》

《HeadFirst设计模式》
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!