面向对象设计模式之---建造者模式(Builder Pattern)

进入正题咯,今天要介绍的是建造者模式。可以想象一下这样一个场景:工厂要组装人偶的过程,以前是全手工的,难免会出现缺胳膊少腿的情况,现在都是机器流水线,这个问题就避免了。再比如我们经常见到的KFC和金拱门,它们的味道在全世界都是一样的,但是如果我们去一些小餐馆吃饭,每一次去的味道多多少少会有些不同。原因在哪里呢?原因就在与洋快餐把所有的工序都进行了严格的控制,这样生产出来的产品都是一个模子刻出来的;但是小餐馆就不同了,菜好不好吃,完全凭厨师~

所以,在编程中为了效率(比如游戏中要时不时产生敌人),可以将事务的细节部分和公共部分进行分离,这样总可以保证在大体的结构上是不会出错的,也就是不会出现缺胳膊少腿的情况。那么细节部分怎么办呢?下面就要引入建造者模式了。

建造者模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。——《大话设计模式》

建造者模式的UML类图如下,以构造小人为例:

可以发现,建造者模式由三个部分组织,第一个部分是抽象类 Builder,它里面规定了人由哪些部分组成,这些都是抽象方法,我们知道,如果子类不实现这些抽象方法的话,程序是编译不成功的,这也从一个侧面保证了构建人物的完整性。第二个部分是ThinBuilder和FatBuilder,它们继承Builder类,很显然,这两个类是用来处理构建人物的具体细节的,这也回答了我们上边遗留的那个问题。最后一个部分是Director类,指挥者类,由它来控制人的组装,从另一个方面保证完整性。这个类同时也是对外的,开发人员只需直接与Director类打交道即可,只要告诉它我们要什么样子的人,比如胖人,瘦人等,这个Director类会使用多态来创造我们需要的东西,无需知道构建的细节。

将构建人物的例子转化为代码如下:

import java.util.*;

abstract class Builder
{
  public abstract void buildHead();
  public abstract void buildBody();
  public abstract void buildLeftArm();
  public abstract void buildRightArm();
  public abstract void buildLeftLeg();
  public abstract void buildRightLeg();
}

class ThinBuilder extends Builder
{
    public void buildHead()
   {
    System.out.println("构建头部...");
   }

   public void buildBody()
   {
     System.out.println("构建身体,这个人比较瘦...");
   }

   public void buildLeftArm()
   {
     System.out.println("构建左臂...");
   }

   public void buildRightArm()
   {
     System.out.println("构建右臂...");
   }

   public void buildLeftLeg()
   {
      System.out.println("构建左腿...");
   }

   public void buildRightLeg()
   {
     System.out.println("构建右腿...");
   }
}

class FatBuilder extends Builder
{
    public void buildHead()
   {
    System.out.println("构建头部...");
   }

   public void buildBody()
   {
     System.out.println("构建身体,这个人比较胖...");
   }

   public void buildLeftArm()
   {
     System.out.println("构建左臂...");
   }

   public void buildRightArm()
   {
     System.out.println("构建右臂...");
   }

   public void buildLeftLeg()
   {
      System.out.println("构建左腿...");
   }

   public void buildRightLeg()
   {
     System.out.println("构建右腿...");
   }
}

class Director
{
  public void createPerson(Builder bt)
  {
    bt.buildHead();
    bt.buildBody();
    bt.buildLeftArm();
    bt.buildRightArm();
    bt.buildLeftLeg();
    bt.buildRightLeg();
  }
}

public class Main
{
  public static void main(String args[])
  {
    ThinBuilder tb = new ThinBuilder();
    FatBuilder fb = new FatBuilder();
    Director d = new Director();
    d.createPerson(tb);
    d.createPerson(fb);
  }
}

程序运行效果如下:

构建头部...
构建身体,这个人比较瘦...
构建左臂...
构建右臂...
构建左腿...
构建右腿...
构建头部...
构建身体,这个人比较胖...
构建左臂...
构建右臂...
构建左腿...
构建右腿...
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值