23种设计模式之建造者模式(Bulider模式)

转载地址:https://sscloud.net/solution/jsp/article.jsp?articleId=10088

 

模式的定义与特点

23种设计模式demo下载

建造者(Builder)模式的定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。


该模式的主要优点如下:

  1. 各个具体的建造者相互独立,有利于系统的扩展。
  2. 客户端不必知道产品内部组成的细节,便于控制细节风险。


其缺点如下:

  1. 产品的组成部分必须相同,这限制了其使用范围。
  2. 如果产品的内部变化复杂,该模式会增加很多的建造者类。


建造者(Builder)模式和工厂模式的关注点不同:建造者模式注重零部件的组装过程,而工厂方法模式更注重零部件的创建过程,但两者可以结合使用。

模式的结构与实现

建造者(Builder)模式由产品、抽象建造者、具体建造者、指挥者等 4 个要素构成,现在我们来分析其基本结构和实现方法。

1. 模式的结构

建造者(Builder)模式的主要角色如下。

  1. 产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个滅部件。
  2. 抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()。
  3. 具体建造者(Concrete Builder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。
  4. 指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。


其结构图如图 1 所示。
 

建造者模式的结构图
图1 建造者模式的结构图

2. 模式的实现

以建房子demo说明建造者模式的用法

/**
 * 建造者(Builder)模式是创建型模式,创建了一个对外隐藏创建过程的产品,使用组合的方式,由指挥者(Director)来决定建造的流程。
 * 
 * 建造者模式:将各种产品集中起来进行管理,用来创建复合对象。
 * 
 * 将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。
 * 
 * @author sscloud.net E-mail:[email protected]
 * @Date 2019年1月20日下午7:16:44
 * @version 1.0
 * @since 
 **/
public class Demo {
public static void main(String[] args) {
HouseFactory factory = new HouseFactory();
HouseBuilder builder = new StandardMazeBuilder(factory);
Director director = new Director(builder);
director.construct();
System.out.println(builder.currentMaze.getRoomCount());
}
}

 

/**
 * @Date 2018年7月29日19:49:01
 * @fun Builder
 * @author sscloud.net
 *
 */
public abstract class HouseBuilder {
public abstract void Buildmaze();
public abstract void BuildRoom(int number);
public abstract void BuildDoor(int roomFrom, int roomTo);
public abstract House GetHouse();
public abstract HouseFactory getHouseFactory();

protected HouseBuilder(HouseFactory factory){
this.factory = factory;
}

protected HouseFactory factory;
protected House currentMaze;
}

/**
 * @Date 2018年7月29日19:48:45
 * @Fun Standard House Builder is created by Builber.
 * @author sscloud.net
 *
 */
public class StandardMazeBuilder extends HouseBuilder {


public StandardMazeBuilder(HouseFactory factory) {
// TODO Auto-generated constructor stub
super(factory);
}

@Override
public void Buildmaze() {
// TODO Auto-generated method stub
this.currentMaze = factory.MakeHouse();
}

 

。。。。。

/**
 * 指挥者:指导 如何 建造
 * @author sscloud.net E-mail:[email protected]
 * @Date 2019年1月20日下午7:29:25
 * @version 1.0
 * @since 
 **/
public class Director {
private HouseBuilder builder;

public Director(HouseBuilder builder) {
// TODO Auto-generated constructor stub
this.builder = builder;
}

/**
* 建造方法:定义了建造的流程
*/
public void construct(){
builder.Buildmaze();
builder.BuildRoom(1);
builder.BuildRoom(2);
builder.BuildDoor(1, 2);
}
}

 

23种设计模式demo下载