java设计模式之构建者模式(builder pattern)

构建者模式,顾名思义就是类似造房子,有一个固定的流程。将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为构建者模式。

在构建者模式中存在着以下4个角色

1、builder :为创建一个产品对象的各个部件指定抽象接口

2、ConcreteBuilder: 实现Builder的接口以构造和装配产品的各个部件,是构建者的实现类,承担具体的构建任务

3、Director(Designer)设计者, 构造一个使用Builder接口的对象,负责构建的过程,首先做什么,然后做什么,设计者负责来设计,但是具体的实现,他是不做的,需要交给实际构建者来承担

4、Product表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并且定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

这里以构建一座房屋为例进行说明:比如,我需要造一座房子,但是我不知道怎么盖,也不知道怎么设计,于是我要找一帮建筑工人,他们会砌墙。还需要找一个设计师,他知道怎么设计,我还要确保工人挺设计师的领导。而设计师本身是不干活的,光是下达命令,这里砌一堵墙,那里造一扇窗。这样工人开始建设,最后我从工人那里收房。

首先定义建造房子的构建方法:

public interface Builder {
    void makeWindow();
    void makeFloor();
    Room getRoom();
}

房子model

@Data
public class Room {
    private String window;
    private String floor;
}

定义设计师。它的职责是指挥工人按照自己的设计图纸建造房子

/**
 * 设计师,专门用来设计房屋,它用以控制制造房屋的整个过程以及流程!
 */
public class Designer {

    public void order(Builder builder){
//       1、先建造窗户
       builder.makeWindow();
//       2、 再建造地板
       builder.makeFloor();
    }
}

工人、负责工程的具体施工

/**
 * 工人,负责进行详细部件如窗户,地板的建造
 * 同一时候由于房子是工人建设的,因此建设完毕后由他把房子递交回去交给房主
 */
public class Worker implements Builder{
    private String window = "";
    private String floor = "";

    Room room = new Room();

    @Override
    public void makeWindow() {
        System.out.println("经过一系列复杂操作生产窗户!");
        window = new String("创建好了window!");
        room.setWindow(window);
    }

    @Override
    public void makeFloor() {
       System.out.println("经过一系列复杂操作生产天花板等!");
       floor = new String("创建好了floor!");
       room.setFloor(floor);
    }

    @Override
    public Room getRoom() {
        if(!window.equals("") && !floor.equals("")){
            System.out.println("房子已经全部修建好!");
            return room;
        }else {
            return null;
        }
    }

}

最后就是房主可以收房了

    public static void main(String[] args) {
        Builder worker = new Worker();
        Designer d = new Designer();
        d.order(worker);
        Room room = worker.getRoom();
        System.out.println("最终建造的房子是:"+room);
    }

result:
经过一系列复杂操作生产普通窗户!
经过一系列复杂操作生产普通天花板等!
房子已经全部修建好!
最终建造的房子是:Room(window=创建好了普通-window!, floor=创建好了普通-floor!)

如果后面有新的需求,比如房主觉得这个房子又需要修建一个更加高级的房子,其实还是可以按照以前设计师的设计图纸进行建造的,只是需要一批高级的建筑工人。而建造房子的工序是没有改变的,因此我们只需要再重新实现以下Builder构建者类就能轻易完成整个建造过程(新的需求)。

一批高级工人来建造房子,新实现Builder建造者类

/**
 * 高级工人盖的房子
 */
public class SeniorWorker implements Builder{
    private String window = "";
    private String floor = "";

    @Override
    public void makeWindow() {
        System.out.println("生产高级窗户!");
        window = new String("创建好了高级的senior-window!");
    }

    @Override
    public void makeFloor() {
       System.out.println("生产高级天花板!");
       floor = new String("创建好了高级的senior-floor!");
    }

    @Override
    public Room getRoom() {
        if(!window.equals("") && !floor.equals("")){
            System.out.println("高级民工-senior房子已经全部修建好!");
            return new Room();
        }else {
            return null;
        }
    }


}

最后交房的时候让这批高级工人来完成就OK了,

    public static void main(String[] args) {
        Builder worker = new SeniorWorker();
        Designer d = new Designer();
        d.order(worker);
        Room room = worker.getRoom();
        System.out.println("最终建造的房子是:"+room);
    }

result:
生产高级窗户!
生产高级天花板!
高级民工-senior房子已经全部修建好!
最终建造的房子是:Room(window=创建好了高级的senior-window!, floor=创建好了高级的senior-floor!)

发现只需要稍加改造就能达到我们建造高级房子的目的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值