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,比较

        细心地读者能够发现,建造者模式跟工厂模式很像,甚至能够通用,我我的以为这两个设计模式最大的区别就是控制的粒度不一样,建造者模式更关注的是对象细节的建立,而工厂模式关注的则是对象类型的选取

相关文章
相关标签/搜索