文档章节

java - 建造者模式

偶尔诗文
 偶尔诗文
发布于 2017/04/29 09:47
字数 906
阅读 10
收藏 1

1,定义:

       建造者模式也叫生成器模式,将一个复杂对象的构件与它的标识分离,使得同样的构建过程可以构件不同的标识。

2,通用类图:

3,角色

(1)产品类(构建的目标对象类)

(2)Builder抽象构造者:规范产品的组件,一般由子类实现

(3)ConcreteBuilder:具体构造者,实现抽象构造者的构造方法

(4)Director导演类:通知builder开始建造

 

4,通用伪代码

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,例子

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

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

 

 

 

 

 

 

© 著作权归作者所有

偶尔诗文
粉丝 12
博文 148
码字总数 65607
作品 0
沈阳
高级程序员
私信 提问
折腾Java设计模式之建造者模式

博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, allowing the same construction process to create variou......

大萌小路
04/15
16
0
JAVA设计模式之模板方法模式和建造者模式

一、前期回顾 上一篇《Java 设计模式之工厂方法模式与抽象工厂模式》介绍了三种工厂模式,分别是工厂方法模式,简单工厂方法模式,抽象工厂模式,文中详细根据实际场景介绍了三种模式的定义,...

木木匠
2018/11/17
25
0
Java之美[从菜鸟到高手演变]之设计模式

设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代...

只想一个人静一静
2014/02/25
209
2
java 23种设计模式 深入理解

以下是学习过程中查询的资料,别人总结的资料,比较容易理解(站在各位巨人的肩膀上,望博主勿究) 创建型 抽象工厂模式 http://www.cnblogs.com/java-my-life/archive/2012/03/28/2418836.html ...

wc_飞豆
2018/03/16
130
0
深入理解建造者模式 ——组装复杂的实例

历史文章回顾: 设计模式专栏 深入理解单例模式 深入理解工厂模式 历史优质文章推荐: 分布式系统的经典基础理论 可能是最漂亮的Spring事务管理详解 面试中关于Java虚拟机(jvm)的问题看这篇...

Snailclimb
2018/06/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
37分钟前
4
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
今天
6
0
数据库中间件MyCat

什么是MyCat? 查看官网的介绍是这样说的 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵...

沉浮_
今天
4
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
今天
6
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部