建造者模式

1.1什么是建造者模式

创建者模式又叫建造者模式,是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。创建者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象。

指挥者(Director)直接和客户(Client)进行需求沟通,然后指挥者将客户创建产品的需求划分为各个部件的建造请求(Builder),将各个部件的建造请求委派到具体的建造者(ConcreteBuilder),各个具体建造者负责进行产品部件的构建,最终构建成具体产品(Product)。
例如以builder模式创建共享单车为例子:

//首先存在一个产品类(三个属性:支架、座位、轮胎)
public class Bike { 

    private IFrame frame; 
    private ISeat seat; 
    private ITire tire; 
    /*
    getandset方法
    */
} 
// 抽象 builder 类 
public abstract class Builder { 
    //建造支架
    abstract void buildFrame();
    //建造座位
    abstract void buildSeat(); 
    //建造轮胎
    abstract void buildTire(); 
    建造车辆
    abstract Bike createBike(); 
} 
// 具体 builder 类 
public class MobikeBuilder extends Builder{ 
    private Bike mBike = new Bike(); 
    @Override 
    void buildFrame() { 
        mBike.setFrame(new AlloyFrame()); 
    } 
    @Override 
    void buildSeat() { 
        mBike.setSeat(new DermisSeat()); 
    } 
    @Override 
    void buildTire() { 
        mBike.setTire(new SolidTire()); 
    } 
    @Override 
    Bike createBike() { 
        return mBike; 
    } 
} 

public class OfoBuilder extends Builder{ 
    private Bike mBike = new Bike(); 
    @Override 
    void buildFrame() { 
        mBike.setFrame(new CarbonFrame()); 
    } 
    @Override 
    void buildSeat() { 
        mBike.setSeat(new RubberSeat()); 
    } 
    @Override 
    void buildTire() { 
        mBike.setTire(new InflateTire()); 
    } 
    @Override 
    Bike createBike() { 
        return mBike; 
    } 
} 
//指挥者类传入具体的建造者类。
public class Director { 
    private Builder mBuilder = null; 
    public Director(Builder builder) { 
        mBuilder = builder; 
    } 
    public Bike construct() { 
        mBuilder.buildFrame(); 
        mBuilder.buildSeat(); 
        mBuilder.buildTire(); 
        return mBuilder.createBike(); 
    } 
}
//客户端使用
public class Click { 
    public static void main(String[] args) { 
        showBike(new OfoBuilder()); 
        showBike(new MobikeBuilder()); 
    } 
    private void showBike(Builder builder) {
        Director director = new Director(builder); 
        Bike bike = director.construct(); 
        bike.getFrame().frame(); 
        bike.getSeat().seat(); 
        bike.getTire().tire(); 
    } 
} 

1.2java中建造者模式的使用

java中的stringbuffer和StringBuilder、springMVC中UriComponents和UriComponentsBuilder。

1.3一般情境下应用:

假如我们需要构造一个包含10个属性,假如这十个属性都是可有可无的,那我们可能需要写很多个重复的set方法代码。但是我们可以使用创建一个Builder类,通过Builder类去创建所需要的类。假如我们需要一个Header类,这个Header具有属性clientid、correlationid等一系列函数。我们大概率会使用下面这种方法去赋值给Header类。

Header header = new Header();
header.setClientId(SOAHeader.SOAP_CLIENT_ID);
header.setCorrelationId(SOAHeader.SOAP_CORRELATION_ID);
。。。。。。

但是如果属性很多的话,就会显得代码重复切不便于阅读。我们可以采用下面的方法建造一个HeaderBuilder类。

public class HeaderBuilder {
	
    protected BigInteger replyCd;
    protected String clientId;
    protected String recptId;
    protected String transId;
    protected String correlationId;
    protected String userId;
    protected String logTxt;
    protected String replyMsg;
    protected String systemName;
    
	public HeaderBuilder setReplyCd(BigInteger replyCd) {
		this.replyCd = replyCd;
		return this;
	}
	public HeaderBuilder setClientId(String clientId) {
		this.clientId = clientId;
		return this;
	}
	public HeaderBuilder setRecptId(String recptId) {
		this.recptId = recptId;
		return this;
	}
	public HeaderBuilder setTransId(String transId) {
		this.transId = transId;
		return this;
	}
	public HeaderBuilder setCorrelationId(String correlationId) {
		this.correlationId = correlationId;
		return this;
	}
	public HeaderBuilder setUserId(String userId) {
		this.userId = userId;
		return this;
	}
	public HeaderBuilder setLogTxt(String logTxt) {
		this.logTxt = logTxt;
		return this;
	}
	public HeaderBuilder setReplyMsg(String replyMsg) {
		this.replyMsg = replyMsg;
		return this;
	}
	public HeaderBuilder setSystemName(String systemName) {
		this.systemName = systemName;
		return this;
	}
    
	public Header buildHeader(){
		return new Header(replyCd, clientId, recptId, transId, correlationId, userId, logTxt, replyMsg, systemName);
	} 
   
}

那么在赋值Header类时。我们的代码就可以变为:

Header header = new HeaderBuilder()
   .setClientId(SOAHeader.SOAP_CLIENT_ID)
   .setCorrelationId(SOAHeader.SOAP_CORRELATION_ID)
   .buildHeader();

这样可读性就大幅增加了。

posted @ 2020-07-10 16:15  大嘤熊  阅读(189)  评论(0编辑  收藏  举报