`
tailsherry
  • 浏览: 136209 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

建造模式(Builder)

UML 
阅读更多

一、介绍
建造模式(Builder)主要是为了将一个复杂的对象的构建和它的实际表示分离,使得同样的构建过程可以创建不同的表示。

 

建造模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型和内容就可以构建它们,用户不知道内部的具体构建细节,该模式非常类似与抽象工厂模式。

 

 

二、实例
在看建造模式的实例之前,请最好先理解抽象工厂模式(Abstract Factory) ,这里也依旧是上次那个炖汤的例子!先看看这个Builder模式的大致的UML图。

Builder Design Pattern

 

首先定义一个抽象的建造类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模式

    **建造者模式(Builder Pattern)**是软件设计模式中的一种,属于创建型模式。它将复杂对象的构建过程与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式通常用于那些需要大量构造参数的对象,通过...

    设计模式 创建型模式 Builder模式(建造者)

    Builder模式 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 统设计中,有时候面临着一个“复杂系统”的创建工作,该对象通常由各个部分的子对象用一定的算法构成,或者说按一定的...

    C#设计模式之建造者(Builder)模式示例源代码

    在深入探讨C#设计模式中的建造者(Builder)模式之前,我们先来理解一下什么是设计模式。设计模式是在软件工程中解决常见问题的一种通用可重用解决方案,它们提供了一种标准化的方法来解决软件开发中遇到的挑战。...

    设计模式之创建模式Builder

    建造者模式(Builder Pattern)是设计模式中的一种创建型模式,它允许我们分步骤构建复杂的对象,而无需暴露其构造过程。这种模式的核心思想在于将对象的构建与表示分离,使得构建过程和不同表示可以独立变化,提高...

    设计模式C++学习之建造者模式(Builder)

    建造者模式(Builder)是设计模式中的一种结构型模式,它允许我们分步骤构建复杂的对象,而无需暴露构造过程。这种模式将构造过程与对象的表示分离,使得同样的构造过程可以创建不同的表示。在C++中,建造者模式通常...

    Builder(建造模式)

    Builder模式是一种设计模式,它属于创建型模式,主要用于构建复杂对象。这种模式提供了一种方法来分离开对象的构造过程和表示方式,使得构造过程可以按照步骤进行,并且允许用户只指定他们关心的部分,而忽略其他不...

    c++-设计模式之“建造者模式(Builder)”

    建造者模式(Builder Pattern)是一种创建型设计模式,允许使用多个简单的对象一步一步构建一个复杂的对象。它将对象的构建过程与表示分离,使得同样的构建过程可以创建不同的表示。 建造者模式的组成 产品...

    建造者模式【Builder Pattern】(一)问题提出

    建造者模式【Builder Pattern】是一种设计模式,它在软件工程中用于将复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。这种模式在处理复杂对象的构造时特别有用,因为它允许我们通过分离构造...

    生成器模式builder

    在Java或其他面向对象语言中,生成器模式通常包括四个主要角色:产品(Product)、建造者(Builder)、具体建造者(Concrete Builder)和导演(Director)。产品是最终要构建的对象,建造者定义了产品的部分或全部...

    Java 设计模式-建造者模式(Builder)Android讲解

    建造者模式(Builder)是Java设计模式中的一种创建型模式,它允许我们分步骤构建复杂的对象,而无需暴露其构造过程。在Android开发中,这种模式尤其有用,因为Android组件如Activity、Fragment等的初始化过程通常...

    69-Java设计模式之建造者 Builder1

    建造者模式(Builder Pattern)是Java设计模式中的一种,它属于创建型模式,主要用于构建复杂的对象。这种模式将对象的创建过程与表示分离,使得同样的创建过程可以创建不同的表示。在实际开发中,当我们需要创建的...

    设计模式之建造者模式代码示例

    建造者模式(Builder Pattern)是软件工程中一种用于创建对象的抽象工厂方法,它将复杂的构建过程分解为一系列步骤,使得构建过程可以独立于其表示进行。这种模式允许客户端使用相同的构建过程创建不同表现形式的...

    建造者模式【Builder Pattern】(二)问题改进

    建造者模式(Builder Pattern)是一种创建型设计模式,它允许我们分步骤构建复杂对象,而无需暴露构造过程的细节。这种模式将一个复杂的构建过程分解为一系列简单的步骤,使得构造过程可以有不同的解释,从而实现...

    设计模式-Builder模式demo

    在Java中,Builder模式通常包含四个主要角色:Product(产品),Builder(建造者),ConcreteBuilder(具体建造者)和Director(导演)。Product是被构建的对象,Builder定义了产品的构造接口,ConcreteBuilder实现...

    建造模式(代码)

    建造模式是一种设计模式,它将复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。在软件工程中,这种模式常用于当一个类的实例化过程过于复杂,或者需要通过不同的步骤来构建时。建造模式允许...

    设计模式——建造者模式

    建造者模式是一种结构型设计模式,它允许我们分步骤创建复杂对象,而无需暴露构建过程的内部细节。这种模式在Java编程中非常常见,尤其是在处理需要多种构建方式或需要隔离对象构造过程的场景。 建造者模式的核心...

    建造者模式c++实现

    建造者模式是一种设计模式,它将复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。在C++中实现建造者模式,我们可以遵循以下步骤: 首先,我们需要定义一个抽象建造者(Builder)类,它声明了一...

    [创建型模式]设计模式之建造者模式(Builder Pattern)

    【创建型模式】设计模式之建造者模式(Builder Pattern) 建造者模式(Builder Pattern)是设计模式中的一个创建型模式,它提供了一种方法来分步骤构造复杂的对象,使得构造过程和表示分离,使得同样的构建过程可以...

    (创建型模式)Builder模式

    Builder模式通常包含四个主要角色:Product(产品),Builder(建造者),ConcreteBuilder(具体建造者)和Director(导演)。Product是被构建的对象,具有多种组成部件;Builder定义了构建产品的接口,而不涉及具体...

    Builder模式

    ### Builder模式:构建复杂对象的艺术 #### 概述 Builder模式是一种软件工程设计模式,它将复杂对象的构建过程与其表示分离,使同一构建过程能够创建出不同的表示。这一模式通常用于创建复合对象,通过子类继承和...

Global site tag (gtag.js) - Google Analytics