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

建造者模式(Builder Pattern)也叫生成器模式,其定义如下:“separate the construction of a complex object from its representation so that the same construction process can create different representations“。将一个复杂对象的构建与它的标示分离,使同样的构建过程刻意创建不同的表示。

建造模式是将复杂的内部创建封装在内部,对于外部调用的人来说,只需要传入建造者和建造工具,对于内部是如何建造成成品的,调用者无需关心。

建造者模式的优点:

  • 封装性:使用建造者模式可以使客户端不必知道产品内部组成的细节,如例子中我们就不需要关心每一个具体的模型内部是如何实现的,产生的对象类型就是CarModel。
  • 可扩展性:Builder之间是相互独立的,与其它的Builder无关,对系统的扩展非常有利。
  • 可控性:由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。

建造者模式有四种角色:

  1. 产品(Product)。产品就是要被构造的复杂对象,包含对象的各个组成部件,包括将这些部件装配成最终产品的方法。
  2. 建造者(Builder)。一个抽象接口,规范产品各个组成部件的建造。接口包含两种方法,一是各部分建造的方法,二是返回产品结果的方法。
  3. 具体建造者(ConcreteBuilder)。实现建造者接口,提供产品的实例。
  4. 指导者(Director)。构造一个Builder接口的对象,不需要知道产品内容。

下面以建立一个学生对象为例子。

首先,定义一个学生信息类,包含学生信息的各个组成成分和一个显示具体信息的方法。

public class Student
{
   private String name   = null;
   private int    age    = -1;
   private String sex    = null;
   private float  weight = -1;
   private float  height = -1;

   public String getName()
   {
      return name;
   }

   public void setName(String name)
   {
      this.name = name;
   }

   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 float getWeight()
   {
      return weight;
   }

   public void setWeight(float weight)
   {
      this.weight = weight;
   }

   public float getHeight()
   {
      return height;
   }

   public void setHeight(float height)
   {
      this.height = height;
   }

   public void showInfo()
   {
      System.out.println("姓名:" + getName() + "\n性别:" + getSex() + "\n年龄:" + getAge()
            + "岁\n身高:" + getHeight() + "厘米\n体重:" + getWeight() + "公斤");
   }
}

然后,定义建造者需要的行为。

/**
 * 接口,定义建造者要做的行为
 */
public abstract class Builder
{
   protected Student student = new Student();
   
   public abstract void setName(String name);

   public abstract void setAge(int age);

   public abstract void setSex(String sex);

   public abstract void setWeight(float weight);

   public abstract void setHeight(float height);

   public abstract Student getStudent();
}

接着,实现建造者的接口。

/**
 * 建造者实现类,执行具体操作
 */
public class CollegeStudentBuilder extends Builder
{
   @Override
   public void setName(String name)
   {
      student.setName(name);
   }

   @Override
   public void setAge(int age)
   {
      student.setAge(age);
   }

   @Override
   public void setSex(String sex)
   {
      student.setSex(sex);
   }

   @Override
   public void setWeight(float weight)
   {
      student.setWeight(weight);
   }

   @Override
   public void setHeight(float height)
   {
      student.setHeight(height);
   }
   
   @Override
   public Student getStudent()
   {
      return student;
   }
}

而指导者则是传入的Builder和Builder的参数来构造Builder。

/**
 * 指导者/设计师,构建一个建造者
 */
public class Director
{
   private Builder mBuilder = null;

   public Director(Builder builder)
   {
      mBuilder = builder;
   }

   public void construct(String name, int age, String sex, float weight, float height)
   {
      mBuilder.setName(name);
      mBuilder.setAge(age);
      mBuilder.setSex(sex);
      mBuilder.setHeight(height);
      mBuilder.setWeight(weight);
   }
}

最后,测试一下。

public class JavaTest
{
   public static void main(String[] args)
   {
      Builder builder = new CollegeStudentBuilder();
      Director director = new Director(builder);
      director.construct("张三", 18, "男", 56, 172);
      Student student = builder.getStudent();
      student.showInfo();
   }
}

结果显示:

姓名:张三
性别:男
年龄:18岁
身高:172.0厘米
体重:56.0公斤

与工厂方法模式相比,建造者模式关注的是各个部件的类型和装配工艺(顺序)。

与抽象工厂模式相比,建造者模式返回一个组装好的完整产品,而抽象工厂模式返回一系列相关的产品,这些产品位于不同的产品等级结构,构成了一个产品族。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值