建造者模式: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
提供一种“封装机制”来隔离“复杂对象的各个部”的变化,从而保持系统中的“稳定构建算法”而不随需求的变化而变化。
解决的问题:
主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
使用场景:
1、需要生成的对象具有复杂的内部结构。
2、需要生成的对象内部属性本身相互依赖。
基于这两个要求,Builder或者ConcreteBuilder角色里可以做参数格式以及属性依赖的验证。
与抽象工厂的区别:
用意的区别:建造者模式更加关注与零件装配的顺序;工厂模式专注于产品的生产,而建造者模式专注于相同产品的不同表示形式上。
结构的区别:
1、在建造者模式里,有个指导者,由指导者来管理建造者,用户是与指导者联系的,
2、指导者联系建造者最后得到产品。即建造模式可以强制实行一种分步骤进行的建造过程。
角色:
1、Builder:为创建一个产品对象的各个部件指定抽象接口。
2、ConcreteBuilder:实现抽象类的所有未实现的方法,具体来说一般是两项任务:组建产品;返回组建好的产品。
3、Director:构造一个使用Builder接口的对象。负责调用适当的建造者来组建产品,导演类一般不与产品类发生依赖关系,与导演类直接交互的是建造者类。一般来说,导演类被用来封装程序中易变的部分。
4、Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
Director知道“要做什么”, Builder负责“做出来”;
类图结构:
JDK中的使用案例(基本上是简化的变种):
java.lang.StringBuilder#append()
java.lang.StringBuffer#append()
java.sql.PreparedStatement
举例:
产品类
public class Product {
private String name;
private String type;
public void showProduct() {
System.out.println("名称:" + name);
System.out.println("型号:" + type);
}
public void setName(String name) {
this.name = name;
}
public void setType(String type) {
this.type = type;
}
}
抽象建造者:
public abstract class Builder {
public abstract void setPart(String arg1, String arg2);
public abstract Product getProduct();
}
具体建造者:
public class ConcreteBuilder extends Builder {
private Product product = new Product();
public Product getProduct() {
return product;
}
public void setPart(String name, String type) {
product.setName(name);
product.setType(type);
}
}
导演类:
public class Director {
private Builder builder = new ConcreteBuilder();
public Product getAProduct() {
builder.setPart("宝马汽车", "X7");
return builder.getProduct();
}
public Product getBProduct() {
builder.setPart("奥迪汽车", "Q5");
return builder.getProduct();
}
}
客户端:
public class Client {
public static void main(String[] args){
Director director = new Director();
Product product1 = director.getAProduct();
product1.showProduct();
Product product2 = director.getBProduct();
product2.showProduct();
}
}
-----------------------------------------------------------------------------
在实际的应用中,更常使用的场景是:
Builder 和 ConcreteBuilder 角色合并为一个类
Director类:由Client 来代替
比如:
public final class Hero {
private final Profession profession;
private final String name;
private final HairType hairType;
private final HairColor hairColor;
private final Armor armor;
private final Weapon weapon;
private Hero(Builder builder) {
this.profession = builder.profession;
this.name = builder.name;
this.hairColor = builder.hairColor;
this.hairType = builder.hairType;
this.weapon = builder.weapon;
this.armor = builder.armor;
}
public Profession getProfession() {
return profession;
}
public String getName() {
return name;
}
public HairType getHairType() {
return hairType;
}
public HairColor getHairColor() {
return hairColor;
}
public Armor getArmor() {
return armor;
}
public Weapon getWeapon() {
return weapon;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("This is a ")
.append(profession)
.append(" named ")
.append(name);
if (hairColor != null || hairType != null) {
sb.append(" with ");
if (hairColor != null) {
sb.append(hairColor).append(' ');
}
if (hairType != null) {
sb.append(hairType).append(' ');
}
sb.append(hairType != HairType.BALD ? "hair" : "head");
}
if (armor != null) {
sb.append(" wearing ").append(armor);
}
if (weapon != null) {
sb.append(" and wielding a ").append(weapon);
}
sb.append('.');
return sb.toString();
}
/**
*
* The builder class.
*
*/
public static class Builder {
private final Profession profession;
private final String name;
private HairType hairType;
private HairColor hairColor;
private Armor armor;
private Weapon weapon;
/**
* Constructor
*/
public Builder(Profession profession, String name) {
if (profession == null || name == null) {
throw new IllegalArgumentException("profession and name can not be null");
}
this.profession = profession;
this.name = name;
}
public Builder withHairType(HairType hairType) {
this.hairType = hairType;
return this;
}
public Builder withHairColor(HairColor hairColor) {
this.hairColor = hairColor;
return this;
}
public Builder withArmor(Armor armor) {
this.armor = armor;
return this;
}
public Builder withWeapon(Weapon weapon) {
this.weapon = weapon;
return this;
}
public Hero build() {
return new Hero(this);
}
}
}
客户端为:
public class App {
public static void main(String[] args) {
Hero mage =
new Hero.Builder(Profession.MAGE, "Riobard").withHairColor(HairColor.BLACK)
.withWeapon(Weapon.DAGGER).build();
System.out.println(mage);
}
}
参考:
http://www.cnblogs.com/beyondbycyx/p/4424579.html
- 大小: 25.2 KB
分享到:
相关推荐
Builder模式是一种创建型设计模式,它提供了一种创建对象的抽象接口,并允许子类按照步骤构建复杂的对象。这种模式将对象的创建过程分离出来,使得同样的构造过程可以创建不同的表示,从而实现对象创建过程的解耦。 ...
**Angular的表单设计器——Angular-Form-Builder** Angular-Form-Builder是一个强大的工具,用于在Angular应用程序中动态创建和管理表单。它允许开发者通过拖放的方式构建复杂的表单结构,无需手动编写大量的HTML和...
ECharts-Theme-Builder, 为ECharts设计自己的主题 ECharts-Theme-Builder为ECharts设计自己的主题联机主题生成器 插件生成$ npm install$ bower install$ gulp watch
5. **开发模式**:在开发过程中,可以使用 `swint-builder-html dev` 命令启动开发服务器,实现自动编译和热加载。 ### 实战应用 Swint-Builder-HTML 在实际项目中的应用可以帮助开发者快速构建复杂的单页应用...
设计模式-创建者模式(Builder) 创建者模式(Builder)是软件设计模式中的一种结构型模式,它将一个复杂对象的构造与它的表示分离,使得同样的构建过程可以创建不同的表示。该模式允许用户可以只通过指定复杂对象...
Builder设计模式是创建型模式之一,主要解决复杂对象的构建问题,使得构建过程与表示分离。 Builder模式的核心思想是将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。这种模式通常应用于...
这种方式的好处在于可以将业务逻辑与视图层的表示分离,遵循MVC(模型-视图-控制器)的设计模式,使代码更符合最佳实践。 1. **安装与配置** 要开始使用form-builder,首先需要通过Composer将其添加到项目的依赖中...
C#设计模式(8)-Builder Pattern C#设计模式(7)-Singleton Pattern C#设计模式(6)-Abstract Factory Pattern C#设计模式(5)-Factory Method Pattern C#设计模式(4)-Simple Factory Pattern C#设计模式...
今天我们要深入探讨的是Builder设计模式,这是一种创建型设计模式,它提供了一种方法来分步骤构造复杂的对象,使得构建过程和表示分离。Builder模式在Java编程中尤其常见,尤其是在处理字符串操作时,例如`...
根据给定文件内容,以下是关于Java设计模式的知识点说明: 1. 策略模式(Strategy Pattern)是一种行为设计模式,允许在运行时选择算法的行为。策略模式的意图是定义一系列算法,将每个算法封装起来,并使它们可以...
而`swint-builder-svg`就是一款用于生成SVG精灵的开源库。 **SVG精灵的概念与优势** SVG精灵是将多个SVG图标组合成一个单一的SVG文件,通过CSS控制显示或隐藏特定的图标。这种技术有以下优点: 1. **减少HTTP请求...
1. **Fluent接口**:xml-builder采用Fluent API的设计模式,允许开发者通过链式调用来构建XML元素。例如,可以写`Builder().ele('root').ele('child')`来创建一个嵌套的XML结构。 2. **内建类型转换**:库自动将...
"exhibit-builder-uglify" 是一个专为前端开发者设计的开源库,它结合了展示生成器和`uglifyjs`工具,用于缩小JavaScript文件的大小,从而减少页面加载时间,提升用户体验。 `uglifyjs`是一个广泛使用的JavaScript...
设计模式是软件工程中的一种最佳实践,用于解决在软件开发过程中常见的问题。这些模式是由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位大师,通常被称为GoF(Gang of Four),在他们的经典著作...
**PyPI 官网下载 | django-report-builder-5.0.0b1.tar.gz** `django-report-builder-5.0.0b1.tar.gz` 是一个在Python的包管理平台PyPI(Python Package Index)上发布的开源软件包,主要用于Python后端开发,特别...
Django是Python的一个高级Web开发框架,它遵循MVC(模型-视图-控制器)设计模式。Django的核心特性包括ORM(对象关系映射)用于数据库操作,内置的模板引擎用于生成HTML,以及强大的URL调度器。它强调可重用性和“干...
《设计模式--基于C#的工程化实现及扩展》是一本深入探讨软件设计模式的书籍,作者王翔通过C#语言来阐述各种设计模式的工程化应用和拓展。设计模式是软件开发中的一种最佳实践,它总结了在特定场景下解决常见问题的...
Java设计模式是软件开发中的一种最佳实践,它总结了在解决特定问题时程序员们经常采用的有效方法。这个“JAVA设计模式-chm版”资源显然包含了关于Java设计模式的详细信息,便于理解和应用。设计模式是对常见问题的...
Builder模式是一种非常有用的设计模式,它可以使得对象的构建过程更加灵活和可控,但是也需要注意它的缺点,例如增加系统的复杂度和对象的构建时间。 在实际应用中,Builder模式可以应用于各种需要复杂对象构建的...
【标题】"Builder 设计模式详解" Builder设计模式是一种创建型设计模式,它提供了一种方法来分步骤构造复杂的对象,使得构建过程和表示分离,允许用户只关注对象的构建而无需关心具体实现细节。在Java或其他编程...