转载地址:https://sscloud.net/solution/jsp/article.jsp?articleId=10088
建造者(Builder)模式的定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。
该模式的主要优点如下:
其缺点如下:
建造者(Builder)模式和工厂模式的关注点不同:建造者模式注重零部件的组装过程,而工厂方法模式更注重零部件的创建过程,但两者可以结合使用。
建造者(Builder)模式由产品、抽象建造者、具体建造者、指挥者等 4 个要素构成,现在我们来分析其基本结构和实现方法。
1. 模式的结构
建造者(Builder)模式的主要角色如下。
其结构图如图 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);
}
}