一、介绍
建造模式(Builder)主要是为了将一个复杂的对象的构建和它的实际表示分离,使得同样的构建过程可以创建不同的表示。
建造模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型和内容就可以构建它们,用户不知道内部的具体构建细节,该模式非常类似与抽象工厂模式。
二、实例
在看建造模式的实例之前,请最好先理解抽象工厂模式(Abstract Factory) ,这里也依旧是上次那个炖汤的例子!先看看这个Builder模式的大致的UML图。
首先定义一个抽象的建造类SoupBuffetBuilder,和抽象工厂模式一样,在这个抽象类里定义了各种炖汤的制作方法。值得注意的是,这里和抽象工厂不同的是,其中额外定义了一个建造和获取目标集合对象的方法buildSoupBuffet()和getSoupBuffet(),所有的builder都是围绕这个soupBuffet展开,而不再直接返回一种炖汤。
abstract class SoupBuffetBuilder {
SoupBuffet soupBuffet;
public SoupBuffet getSoupBuffet() {
return soupBuffet;
}
public void buildSoupBuffet() {
soupBuffet = new SoupBuffet();
}
public abstract void setSoupBuffetName();
public void buildChickenSoup() {
soupBuffet.chickenSoup = new ChickenSoup();
}
public void buildClamChowder() {
soupBuffet.clamChowder = new ClamChowder();
}
public void buildFishChowder() {
soupBuffet.fishChowder = new FishChowder();
}
public void buildMinnestrone() {
soupBuffet.minnestrone = new Minnestrone();
}
public void buildPastaFazul() {
soupBuffet.pastaFazul = new PastaFazul();
}
public void buildTofuSoup() {
soupBuffet.tofuSoup = new TofuSoup();
}
public void buildVegetableSoup() {
soupBuffet.vegetableSoup = new VegetableSoup();
}
}
同样,接下来我们实例化这个builder抽象类和其中相关的子对象,类似于抽象工厂模式中的实例化过程。[波士顿]炖汤加工中心的代码BostonSoupBuffetBuilder如下:
class BostonSoupBuffetBuilder extends SoupBuffetBuilder {
public void buildClamChowder() {
soupBuffet.clamChowder = new BostonClamChowder();
}
public void buildFishChowder() {
soupBuffet.fishChowder = new BostonFishChowder();
}
public void setSoupBuffetName() {
soupBuffet.soupBuffetName = "Boston Soup Buffet";
}
}
class BostonClamChowder extends ClamChowder {
public BostonClamChowder() {
soupName = "QuahogChowder";
soupIngredients.clear();
soupIngredients.add("1 Pound Fresh Quahogs");
soupIngredients.add("1 cup corn");
soupIngredients.add("1/2 cup heavy cream");
soupIngredients.add("1/4 cup butter");
soupIngredients.add("1/4 cup potato chips");
}
}
class BostonFishChowder extends FishChowder {
public BostonFishChowder() {
soupName = "ScrodFishChowder";
soupIngredients.clear();
soupIngredients.add("1 Pound Fresh Scrod");
soupIngredients.add("1 cup corn");
soupIngredients.add("1/2 cup heavy cream");
soupIngredients.add("1/4 cup butter");
soupIngredients.add("1/4 cup potato chips");
}
}
[檀香山]炖汤加工中心,代码HonoluluSoupBuffetBuilder内容如下:
class HonoluluSoupBuffetBuilder extends SoupBuffetBuilder {
public void buildClamChowder() {
soupBuffet.clamChowder = new HonoluluClamChowder();
}
public void buildFishChowder() {
soupBuffet.fishChowder = new HonoluluFishChowder();
}
public void setSoupBuffetName() {
soupBuffet.soupBuffetName = "Honolulu Soup Buffet";
}
}
class HonoluluClamChowder extends ClamChowder {
public HonoluluClamChowder() {
soupName = "PacificClamChowder";
soupIngredients.clear();
soupIngredients.add("1 Pound Fresh Pacific Clams");
soupIngredients.add("1 cup pineapple chunks");
soupIngredients.add("1/2 cup coconut milk");
soupIngredients.add("1/4 cup SPAM");
soupIngredients.add("1/4 cup taro chips");
}
}
class HonoluluFishChowder extends FishChowder {
public HonoluluFishChowder() {
soupName = "OpakapakaFishChowder";
soupIngredients.clear();
soupIngredients.add("1 Pound Fresh Opakapaka Fish");
soupIngredients.add("1 cup pineapple chunks");
soupIngredients.add("1/2 cup coconut milk");
soupIngredients.add("1/4 cup SPAM");
soupIngredients.add("1/4 cup taro chips");
}
}
不管加工中心如何,我们应该最初定一个目标集合对象SoupBuffet,可以把它理解为是一个集装箱吧!里面盛装了各种各样的炖汤。当然你也可以在里面公布一些额外的方法,比如说对这些炖汤的筛选或者组合等。
class SoupBuffet {
String soupBuffetName;
ChickenSoup chickenSoup;
ClamChowder clamChowder;
FishChowder fishChowder;
Minnestrone minnestrone;
PastaFazul pastaFazul;
TofuSoup tofuSoup;
VegetableSoup vegetableSoup;
public String getSoupBuffetName() {
return soupBuffetName;
}
public void setSoupBuffetName(String soupBuffetNameIn) {
soupBuffetName = soupBuffetNameIn;
}
public void setChickenSoup(ChickenSoup chickenSoupIn) {
chickenSoup = chickenSoupIn;
}
public void setClamChowder(ClamChowder clamChowderIn) {
clamChowder = clamChowderIn;
}
public void setFishChowder(FishChowder fishChowderIn) {
fishChowder = fishChowderIn;
}
public void setMinnestrone(Minnestrone minnestroneIn) {
minnestrone = minnestroneIn;
}
public void setPastaFazul(PastaFazul pastaFazulIn) {
pastaFazul = pastaFazulIn;
}
public void setTofuSoup(TofuSoup tofuSoupIn) {
tofuSoup = tofuSoupIn;
}
public void setVegetableSoup(VegetableSoup vegetableSoupIn) {
vegetableSoup = vegetableSoupIn;
}
public String getTodaysSoups() {
StringBuffer stringOfSoups = new StringBuffer();
stringOfSoups.append(" Today's Soups! ");
stringOfSoups.append(" Chicken Soup: ");
stringOfSoups.append(this.chickenSoup.getSoupName());
stringOfSoups.append(" Clam Chowder: ");
stringOfSoups.append(this.clamChowder.getSoupName());
stringOfSoups.append(" Fish Chowder: ");
stringOfSoups.append(this.fishChowder.getSoupName());
stringOfSoups.append(" Minnestrone: ");
stringOfSoups.append(this.minnestrone.getSoupName());
stringOfSoups.append(" Pasta Fazul: ");
stringOfSoups.append(this.pastaFazul.getSoupName());
stringOfSoups.append(" Tofu Soup: ");
stringOfSoups.append(this.tofuSoup.getSoupName());
stringOfSoups.append(" Vegetable Soup: ");
stringOfSoups.append(this.vegetableSoup.getSoupName());
return stringOfSoups.toString();
}
}
在建造模式里面,还应该有一个指导者(Director)类,它可以接受一个抽象建造类参数,并进一步包装、生产相应的集成产品。
class soupBuffetDirector {
private SoupBuffetBuilder soupBuffetBuilder;
public soupBuffetDirector(SoupBuffetBuilder soupBuffetBuilder) {
this.soupBuffetBuilder = soupBuffetBuilder;
}
public SoupBuffet CreateSoupBuffet() {
soupBuffetBuilder.buildSoupBuffet();
soupBuffetBuilder.setSoupBuffetName();
soupBuffetBuilder.buildChickenSoup();
soupBuffetBuilder.buildClamChowder();
soupBuffetBuilder.buildFishChowder();
soupBuffetBuilder.buildMinnestrone();
soupBuffetBuilder.buildPastaFazul();
soupBuffetBuilder.buildTofuSoup();
soupBuffetBuilder.buildVegetableSoup();
return soupBuffetBuilder.getSoupBuffet();
}
}
三、分析
通过以上建造模式的实例,我们可以总结出以下这些参与者:
- Builder 一个抽象类,其中包含了对各个部件建造的抽象定义。
- ConcreteBuilder 具体建造实现类,可以有一个或多个,实现创建具体部件的过程。
- AbstractProduct 抽象部件类,可以有一个或多个,为一类部件对象声明一个接口。
- ConcreteProduct 具体部件类,定义一个被相应的具体Builder类创建的部件对象,它继承或实现了相应的抽象部件类。
- Director 指导类,实际使用Builder对象的中介类,也是使用该建造模式的一般入口。
- Client 客户端,通过Director来实现建造模式。
实现一个建造模式,需要以下几个关键步骤:
1、定义一个抽象建造类,其中定义获取目标产品的建造以及出口,如buildObject和getObject。
2、定义一个或多个抽象建造类的实现类,顺带的定义了该实现类对应的实际产品种类等。
3、定义一个指导类,用抽象建造类作为参数,来实际使用已有的实际建造类。
建造模式(Builder)有着与抽象工厂模式(Abstract Factory) 一样的优缺点,它一般是用来创建一个比较复杂的大对象,里面包含了多步部件拼装的过程,而最终输出的是一个完整的大对象。
如果说和抽象工厂(Abstract Factory) 的目标是输出许多同等的产品的话,那么建造模式(Builder)应该就是输出一个完整的大对象,里面涵盖了许多个同等的子部件。
分享到:
相关推荐
**建造者模式(Builder Pattern)**是软件设计模式中的一种,属于创建型模式。它将复杂对象的构建过程与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式通常用于那些需要大量构造参数的对象,通过...
Builder模式 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 统设计中,有时候面临着一个“复杂系统”的创建工作,该对象通常由各个部分的子对象用一定的算法构成,或者说按一定的...
在深入探讨C#设计模式中的建造者(Builder)模式之前,我们先来理解一下什么是设计模式。设计模式是在软件工程中解决常见问题的一种通用可重用解决方案,它们提供了一种标准化的方法来解决软件开发中遇到的挑战。...
建造者模式(Builder Pattern)是设计模式中的一种创建型模式,它允许我们分步骤构建复杂的对象,而无需暴露其构造过程。这种模式的核心思想在于将对象的构建与表示分离,使得构建过程和不同表示可以独立变化,提高...
建造者模式(Builder)是设计模式中的一种结构型模式,它允许我们分步骤构建复杂的对象,而无需暴露构造过程。这种模式将构造过程与对象的表示分离,使得同样的构造过程可以创建不同的表示。在C++中,建造者模式通常...
Builder模式是一种设计模式,它属于创建型模式,主要用于构建复杂对象。这种模式提供了一种方法来分离开对象的构造过程和表示方式,使得构造过程可以按照步骤进行,并且允许用户只指定他们关心的部分,而忽略其他不...
建造者模式(Builder Pattern)是一种创建型设计模式,允许使用多个简单的对象一步一步构建一个复杂的对象。它将对象的构建过程与表示分离,使得同样的构建过程可以创建不同的表示。 建造者模式的组成 产品...
建造者模式【Builder Pattern】是一种设计模式,它在软件工程中用于将复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。这种模式在处理复杂对象的构造时特别有用,因为它允许我们通过分离构造...
在Java或其他面向对象语言中,生成器模式通常包括四个主要角色:产品(Product)、建造者(Builder)、具体建造者(Concrete Builder)和导演(Director)。产品是最终要构建的对象,建造者定义了产品的部分或全部...
建造者模式(Builder)是Java设计模式中的一种创建型模式,它允许我们分步骤构建复杂的对象,而无需暴露其构造过程。在Android开发中,这种模式尤其有用,因为Android组件如Activity、Fragment等的初始化过程通常...
建造者模式(Builder Pattern)是Java设计模式中的一种,它属于创建型模式,主要用于构建复杂的对象。这种模式将对象的创建过程与表示分离,使得同样的创建过程可以创建不同的表示。在实际开发中,当我们需要创建的...
建造者模式(Builder Pattern)是软件工程中一种用于创建对象的抽象工厂方法,它将复杂的构建过程分解为一系列步骤,使得构建过程可以独立于其表示进行。这种模式允许客户端使用相同的构建过程创建不同表现形式的...
建造者模式(Builder Pattern)是一种创建型设计模式,它允许我们分步骤构建复杂对象,而无需暴露构造过程的细节。这种模式将一个复杂的构建过程分解为一系列简单的步骤,使得构造过程可以有不同的解释,从而实现...
在Java中,Builder模式通常包含四个主要角色:Product(产品),Builder(建造者),ConcreteBuilder(具体建造者)和Director(导演)。Product是被构建的对象,Builder定义了产品的构造接口,ConcreteBuilder实现...
建造模式是一种设计模式,它将复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。在软件工程中,这种模式常用于当一个类的实例化过程过于复杂,或者需要通过不同的步骤来构建时。建造模式允许...
建造者模式是一种结构型设计模式,它允许我们分步骤创建复杂对象,而无需暴露构建过程的内部细节。这种模式在Java编程中非常常见,尤其是在处理需要多种构建方式或需要隔离对象构造过程的场景。 建造者模式的核心...
建造者模式是一种设计模式,它将复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。在C++中实现建造者模式,我们可以遵循以下步骤: 首先,我们需要定义一个抽象建造者(Builder)类,它声明了一...
【创建型模式】设计模式之建造者模式(Builder Pattern) 建造者模式(Builder Pattern)是设计模式中的一个创建型模式,它提供了一种方法来分步骤构造复杂的对象,使得构造过程和表示分离,使得同样的构建过程可以...
Builder模式通常包含四个主要角色:Product(产品),Builder(建造者),ConcreteBuilder(具体建造者)和Director(导演)。Product是被构建的对象,具有多种组成部件;Builder定义了构建产品的接口,而不涉及具体...
### Builder模式:构建复杂对象的艺术 #### 概述 Builder模式是一种软件工程设计模式,它将复杂对象的构建过程与其表示分离,使同一构建过程能够创建出不同的表示。这一模式通常用于创建复合对象,通过子类继承和...