java - 建造者模式

1,定義:java

       建造者模式也叫生成器模式,將一個複雜對象的構件與它的標識分離,使得一樣的構建過程能夠構件不一樣的標識。程序員

2,通用類圖:設計模式

3,角色eclipse

(1)產品類(構建的目標對象類)ide

(2)Builder抽象構造者:規範產品的組件,通常由子類實現工具

(3)ConcreteBuilder:具體構造者,實現抽象構造者的構造方法開發工具

(4)Director導演類:通知builder開始建造ui

 

4,通用僞代碼this

public class Product {

    private String attr1;

    public String getAttr1() {
        return attr1;
    }

    public void setAttr1(String attr1) {
        this.attr1 = attr1;
    }
}
public abstract class Builder {

    protected abstract void setAttr();
    
    protected abstract Product build();
    
}
public class ConcreteBuilder extends Builder{

    Product product;

    public ConcreteBuilder() {
        product = new Product();
    }

    @Override
    protected void setAttr() {
        product.setAttr1("attr");
    }

    @Override
    protected Product build() {
        return product;
    }
}
public class Director {
    public static Product getProduct() {
        Builder builder = new ConcreteBuilder();
        builder.setAttr();
        return builder.build();
    }
}

5,例子idea

(1)做爲開發人員,IDE(開發工具)是必不可少的,當下比較流行的IDE不少,好比eclipse,idea,假如如今有一個需求,但願實現IDE的組建供程序員挑選,那麼組建過程就能夠用建造者模式

抽象產品類:

public abstract class DevelopTool {

    private String language;

    private String version;

    private String factory;

    private String buildMessage;


    public String getBuildMessage() {
        return buildMessage;
    }

    public void setBuildMessage(String buildMessage) {
        this.buildMessage = buildMessage;
    }

    public String getLanguage() {
        return language;
    }

    public void setLanguage(String language) {
        this.language = language;
    }

    public String getVersion() {
        return version;
    }

    public void setVersion(String version) {
        this.version = version;
    }

    public String getFactory() {
        return factory;
    }

    public void setFactory(String factory) {
        this.factory = factory;
    }
}

兩個具體的實現類,一個是eclipse,一個是idea

/**
eclipse 工具實現類
*/
public class EclipseTool extends DevelopTool{

    public EclipseTool() {

    }


}
/**
idea 工具實現類
*/
public class IdeaTool extends DevelopTool {

}

抽象建造者角色

public abstract class Builder {

    public abstract DevelopTool buildDevelopTool();

}

兩個具體構造者

public class EclipseToolBuilder extends Builder{


    @Override
    public DevelopTool buildDevelopTool() {

        EclipseTool eclipseTool = new EclipseTool();

        eclipseTool.setFactory("meiguo");
        eclipseTool.setLanguage("java");
        eclipseTool.setVersion("1.0.1");
        eclipseTool.setBuildMessage("build a eclipseTool");
        return eclipseTool;
    }
}
public class IdeaToolBuilder extends Builder{

    @Override
    public DevelopTool buildDevelopTool() {
        DevelopTool developTool = new IdeaTool();
        developTool.setBuildMessage("build a idea tool");
        developTool.setVersion("1.0.1");
        developTool.setLanguage("java etc");
        developTool.setFactory("American");
        return developTool;
    }
}

這裏就沒有director了 ,業務系統直接調用

public class MainClient {

    public static void main(String[] args) {
        Builder builder = new IdeaToolBuilder();
        DevelopTool developTool = builder.buildDevelopTool();
        System.out.println(developTool.getBuildMessage());
    }
}

  (2)是否是感受有點繁瑣,寫了半天才只是實現了一個對象的建立,若是你有這樣的疑問,我表示贊成,因此咱們不妨改一下寫法,將build與product融爲一體看一下

 

public class DevelopTool {

    private String language;

    private String version;

    private String factory;

    private String buildMessage;


    private DevelopTool(DevelopBuild developBuild) {
        this.language = developBuild.language;
        this.version = developBuild.version;
        this.factory = developBuild.factory;
        this.buildMessage = developBuild.buildMessage;
    }


    public String getLanguage() {
        return language;
    }

    public String getVersion() {
        return version;
    }

    public String getFactory() {
        return factory;
    }

    public String getBuildMessage() {
        return buildMessage;
    }

    public static class DevelopBuild {

        private String language;

        private String version;

        private String factory;

        private String buildMessage;

        public DevelopBuild setLanguage(String language) {
            this.language = language;
            return this;
        }

        public DevelopBuild setVersion(String version) {
            this.version = version;
            return this;
        }


        public DevelopBuild setFactory(String factory) {
            this.factory = factory;
            return this;
        }


        public DevelopBuild setBuildMessage(String buildMessage) {
            this.buildMessage = buildMessage;
            return this;
        }

        public DevelopTool build() {
            return new DevelopTool(this);
        }

    }

}

而後在業務代碼中直接調用

public class MainClient {

    public static void main(String[] args) {
        DevelopTool.DevelopBuild developBuild = new DevelopTool.DevelopBuild();
        DevelopTool developTool = developBuild.setFactory("meiguo").setLanguage("java").setVersion("1.0.1").setBuildMessage("build a eclipse").build();
        System.out.println(developTool.getBuildMessage());
    }
    
}

好了,貌似也蠻方便的,建造者模式的變種不少,還須要多多揣摩

5,優勢:

(1)封裝性:將建立對象的細節進行封裝, 調用者沒必要關心任何建立細節

(2)容易拓展:特別是對對象的細節,在builder中能夠隨便更改與變種

(3)便於控制細節風險,在builder中能夠對細節進行判斷等操做

 

6,比較

        細心地讀者能夠發現,建造者模式跟工廠模式很像,甚至能夠通用,我我的以爲這兩個設計模式最大的區別就是控制的粒度不一樣,建造者模式更關注的是對象細節的建立,而工廠模式關注的則是對象類型的選取

相關文章
相關標籤/搜索