设计之道,模式为导 -- (二)建造者

157 阅读2分钟

建造者模式

建造者模式属于设计模式中的构造性模式,也就是说该模式基本上是用在构建对象的时候。它的宗旨就是将一个复杂的事物,进行一步一步的构建,需要什么就拼接成什么。

UML

类图如下:

Derictor: 指挥人,哔哩吧啦说你这玩意儿要怎么建

builder:抽象建造者,怎么建的一系列方法

concreteBuilder:具体的劳动力,实现建造的方法

product:具体的产品类

源码分析

给大家讲一个生动形象的例子,小刚喜欢大宝剑,没事就去洗洗脚按按摩。从这句话里面,我们就可以分析出一个模式。 大宝剑:具体的产品 小刚:享受服务的指挥人,要什么服务都由他决定 老板:大宝剑服务的建造者

传统模式下,小刚要一个大大宝剑服务是不是说:老板,做个大宝剑(new dabaojian())服务就出来了。但是存在一个问题,这样叫出来的是个大大宝剑,但是 具体哪一些服务没有指定,老板肯定问你:都想做什么服务;那服务种类很多,不可能每次都是

new Dabaojian("洗脚");
new Dabaojian("洗脚","按摩");
new Dabaojian("洗脚","按摩","打扑克");

服务千姿百态这样就会存在弊端。老板也想到这个问题了 所以老板就会拼接各种服务给客人做成一个大宝剑 具体见代码分析

public class Bighealthcare {
    private String xijiao;
    private String anmo;
    private String dapuke;

    /**
     * 传统享受大宝剑服务就洗洗脚
     * @param xijiao
     */
    public Bighealthcare(String xijiao){
        this.xijiao = xijiao;
    }
    /**
     * 舒服一点就加个按摩
     * @param xijiao
     */
    public Bighealthcare(String xijiao,String anmo){
        this.xijiao = xijiao;
        this.anmo = anmo;
    }

    /**
     * 想更舒服就搞个扑克打一下
     * @param xijiao
     * @param anmo
     * @param dapuke
     */
    public Bighealthcare(String xijiao,String anmo,String dapuke){
        this.xijiao = xijiao;
        this.anmo = anmo;
        this.dapuke = dapuke;
    }
    /**
     * 建造者模式的大宝剑服务
     */
    public Bighealthcare(Builder builder){
        this.xijiao = builder.xijiao;
        this.anmo = builder.anmo;
        this.dapuke = builder.dapuke;
    }
    protected static class Builder{
        protected String xijiao;
        protected String anmo;
        protected String dapuke;

        protected Builder xijiao(String xijiao){
            this.xijiao = xijiao;
            return this;
        }

        protected Builder anmo(String anmo){
            this.anmo = anmo;
            return this;
        }

        protected Builder dapuke(String dapuke){
            this.dapuke = dapuke;
            return this;
        }

        protected Bighealthcare build(){
            return new Bighealthcare(this);
        }
    }

    public void service(){
        System.out.print(this.toString());
    }

小刚要做大宝剑了

public class Test {
    public static void main(String args[]){
        //传统模式下的大宝剑服务
        Bighealthcare tradition = new Bighealthcare("洗个脚","按个摩","打扑克");
        tradition.service();

        //建造器模式下的大宝剑服务,先构造一个大宝剑服务,具体要哪些项目可以一个个拼装,扩展方便
        //运用《effective java》中说的,当构造方法过多时就应该要考虑使用构造器,其实就是建造者模式
        //简单大宝剑
        Bighealthcare simpleBighealthcare = new Bighealthcare.Builder().xijiao("洗个脚").build();
        simpleBighealthcare.service();
        //一般大宝剑
        Bighealthcare generalBighealthcare = new Bighealthcare.Builder().xijiao("洗个脚").anmo("按个摩").build();
        generalBighealthcare.service();
        //高级大宝剑
        Bighealthcare specialBighealthcare = new Bighealthcare.Builder().xijiao("洗个脚").anmo("按个摩").dapuke("打扑克").build();
        specialBighealthcare.service();
    }
}