设计模式——建造者模式(Builder)

建造者模式(Builder)

什么是建造者模式?大部分网上的定义是:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示是看完之后是不是一头雾水啊,我们可以和工厂模式进行比较一下,前面我们已经了解过了工厂模式,它是创建单个类的模式,而建筑者模式则是让各种产品集中管理,用来创建复合对象。复合对象就是指某个类具有不同的属性;

下面我们用一个例子进行讲解,比如一个User类,我们需要构建一大批用户,用户属性:username,password,mail,age,sex;

package cs_factory;

public class User {

private String username;

private String password;

private String mail;

private int age;

private String sex;

public String getMail() {

return mail;

}

public void setMail(String mail) {

this.mail = mail;

}

public String getUsername() {

return username;

}

public void setUsername(String username) {

this.username = username;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public String getSex() {

return sex;

}

public void setSex(String sex) {

this.sex = sex;

}

}

不同用户注册的时候可能全都填写了,而有一些就填了昵称和密码

所有需要构造方法了:

public User(String username, String password, String mail, int age, String sex) {

super();

this.username = username;

this.password = password;

this.mail = mail;

this.age = age;

this.sex = sex;

}

public User(String username, String password){

super();

this.username = username;

this.password = password;

}

其他不一一写了,方法大家都懂

而测试类就该这样,你就可以这样创建各个需要的对象

User user1 = new User("一只猫","123","[email protected]",16,"女");

User user2 = new User("一条鱼","123",20,"男");

User user3 = new User("一只狗","123","[email protected]");

User user4 = new User("一个人","123");

我们可以观察一下这样写是不是可读性很差,鬼知道里面的123是什么,16是什么。如果这样不明显,那么你再加两个属性:身高,体重;是不是更看不懂了。

private double height;
     private double weight;

我们再想想看,就是当有很多参数时,编写这个构造函数就会显得异常麻烦,这时候如果换一个角度,试试Builder模式,你会发现代码的可读性一下子就上去了。我们这样干,把User的构造方法都不要,在里面这样写:

...

private User(Builder builder) {

this.username=builder.username;

this.password=builder.password;

this.mail=builder.mail;

this.age=builder.age;

this.sex=builder.sex;

}

static class Builder{

private String username;

private String password;

private String mail;

private int age;

private String sex;

public Builder username(String username){

this.username=username;

return this;

}

public Builder password(String password){

this.password=password;

return this;

}

public Builder mail(String mail){

this.mail=mail;

return this;

}

public Builder age(int age){

this.age=age;

return this;

}

public Builder sex(String sex){

this.sex=sex;

return this;

}

public User build(){

return new User(this);

}

}

...

那么我们就可以这样构造了:

User.Builder builder = new User.Builder();

User user = builder

.username("一只猫")

.password("123")

.mail("[email protected]")

.age(18)

.sex("女")

.build();

四个字形容:“简单明了” 三个字形容:“真清楚” 两字:“漂亮” 一字:“酷”。

我就问你们是不是都知道我要填的什么属性。在Builder类中的成员函数返回Builder对象自身的另一个作用就是让它支持链式调用,使代码可读性大大增强。其实在java中有两个常见的类也是Builder模式,那就是StringBuilder和StringBuffer。

还有其他的各大框架中广泛应用建造者模式,比如网络请求的okhttp等等。

最后说下我们是怎么干成这样的:

1.首先要一个静态的内部类Builder而且成员和外部类User一毛一样。

2.Builder类通过一系列的方法用于成员变量的赋值,并返回当前对象本身(this)

3.Builder类提供一个build方法或者create方法用于创建对应的外部类,该方法内部调用了外部类的一个私有构造函数,该构造函数的参数就是内部类Builder

4.外部类提供一个私有构造函数供内部类调用,在该构造函数中完成成员变量的赋值,取值为Builder对象中对应的值

时间: 2024-12-18 05:31:46

设计模式——建造者模式(Builder)的相关文章

设计模式—建造者模式(Builder)

title: 设计模式-建造者模式 建造者模式(Builder)是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节.建造者模式属于对象创建型模式.我们获得一个对象的时候不是直接new这个对象出来,而是对其建造者进行属性设置,然后建造者在根据设置建造出各个对象出来.建造者模式又可以称为生成器模式. 模式结构 一个标准的建造者模式包含如下角色: Builder:抽象建造者 ConcreteBuilder:具体建造者 Director

23种设计模式--建造者模式-Builder Pattern

一.建造模式的介绍       建造者模式就是将零件组装成一个整体,用官方一点的话来讲就是将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示.生活中比如说组装电脑,汽车等等这些都是建造者模式的具体体现,组装电脑反应到软件上就是一个复杂的对象,然后我们使用建造者模式的时候需要抽象一个建造类,抽象一个指挥者指挥具体实现的那个类,然后就是具体实现这个对象的类,这样就避免了每新创建一个不同的复杂对象就需要重新写一下这个类,这样就只要重写建造者就可以了,我们接下来就用组装电脑这个来说明一

说说设计模式~建造者模式(Builder)

返回目录 建造者模式是我的"设计模式"里创建型模式里的最后一篇,这种模式在实现中,很多架构都用到了,如MVC,MVP,MVVM,它们都是有建造者模式的精髓的,即,创建与表现分享,我们的MVC何尝不是,我们的MVVM又何尝不是呢,我们做软件的,换肤是常有的事,其实换肤的实现不就是建造者模式最好的体现吗,呵呵. 定义 将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式. 何时能用到它? 1 当创建复杂对象的算法应该独立于该对象的组成部分以

设计模式--建造者模式(Builder)

最近又看了下建造者模式Builder,在网上找了很多文章,但是总感觉有一些问题. 有些示例明明很像一个工厂模式,还有些示例会导致具体建造者类无限膨胀,好像都不大适合使用这个模式.后来又对照GOF重新看了下,同时参考了http://www.cnblogs.com/happyhippy/archive/2010/09/01/1814287.html等文章,写下自己的理解. 1.定义将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.在以下情况使用建造者模式• 当创建复杂对象的算

深入浅出设计模式——建造者模式(Builder Pattern)

模式动机无论是在现实世界中还是在软件系统中,都存在一些复杂的对象,它们拥有多个组成部分,如汽车,它包括车轮.方向盘.发送机等各种部件.而对于大多数用户而言,无须知道这些部件的装配细节,也几乎不会使用单独某个部件,而是使用一辆完整的汽车,可以通过建造者模式对其进行设计与描述,建造者模式可以将部件和其组装过程分开,一步一步创建一个复杂的对象.用户只需要指定复杂对象的类型就可以得到该对象,而无须知道其内部的具体构造细节. 在软件开发中,也存在大量类似汽车一样的复杂对象,它们拥有一系列成员属性,这些成员

建造者模式<Builder>

概述 将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式 角色 建造者(Builder):为创建一个产品对象的各个部件指定抽象接口. 具体建造者(ConcreteBuilder):实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并 提供一个检索产品的接口 产品(Product):表示被构造的复杂对象.ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最

C#设计模式-建造者模式

在软件系统中,有时需要创建一个复杂对象,并且这个复杂对象由其各部分子对象通过一定的步骤组合而成. 例如一个采购系统中,如果需要采购员去采购一批电脑时,在这个实际需求中,电脑就是一个复杂的对象,它是由CPU.主板.硬盘.显卡.机箱等组装而成的,如果此时让采购员一台一台电脑去组装的话真是要累死采购员了,这里就可以采用建造者模式来解决这个问题,我们可以把电脑的各个组件的组装过程封装到一个建造者类对象里,建造者只要负责返还给客户端全部组件都建造完毕的产品对象就可以了.然而现实生活中也是如此的,如果公司要

php设计模式 — 建造者模式

需求分析: 我们接到了一个订单,是宝马公司和奔驰公司的,他们负责定义产品的零部件以及型号,我们负责生产,需求简单的描述就是这样. 我们需要为这个需求设计一个设计模式去更好的适应他们的需求. 首先我们需要一个车模型类,来定义好需要的所有零部件,这就叫做抽象类,之所以这样是因为我们还有可能接到更多公司的订单,比如劳斯莱斯,宾利. 然后由各自的车来继承这个抽象类,实现里面的方法. 接下来就需要一个建造者抽象类,来定义建造各自的车需要的方法 然后由各自车建造者来继承这个抽象类. 我们会想到一个建造模式了

建造者模式(Builder)——从组装电脑开始

建造者模式(Builder)--从组装电脑开始 建造者模式概括起来就是将不同独立的组件按照一定的条件组合起来构成一个相对业务完整的对象.调用者无需知道构造的过程. 我们从组装电脑开始 让我们从买组装电脑开始吧. 首先要买一个电脑,一般都有两个选择 -- 品牌电脑和组装电脑,一般人为了省事和放心都会选择买品牌电脑(也就是整机).在这里,为了更好的分析问题,假定我们为了性价比决定要买组装电脑.那么我们该怎么做呢. 首先我们得学习一个完整的电脑的组成部分有哪些? 经过翻查一部分资料发现,主要部件分为主

C#设计模式——建造者模式(Builder Pattern)

1.建造者模式简介 1.1>.定义 建造者模式(Builder)将复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. 1.2>.使用频率  中低 1.3>.原型模式应用 在软件系统中,有时候面临一个复杂对象的创建工作,该对象通常由各个部分子对象用一定的算法构成,或者按一定的步骤组合而成:这些算法和步骤是稳定的,而构成这个对象的子对象却经常由于需求的变化而不断变化. 生活中的例子,要组装一台电脑,它的组装过程基本是不变的,都可以由主板.CPU.内存等按照某个稳定方式组合而成.