参考《设计模式的艺术软件开发人员内功修炼之道》-刘伟 著
实验目的
建造者模式相当于带组装功能的抽象工厂,由Director负责组装,Builder负责生产具体Product,一个Builder对应一个Product
实验代码
package BuilderPattern;
class Video {
// data
protected String menu;
protected String playlist;
protected String mainWindow;
protected String controlbar;
}
abstract class VideoBuilder {
protected Video video = new Video();
// build action
abstract public void buildMenu();
abstract public void buildPlaylist();
abstract public void buildMainWindow();
abstract public void buildControlBar();
public boolean isbuildMenu() {
return true;
}
public boolean isbuildPlaylist() {
return true;
}
public boolean isbuildMainMenu() {
return true;
}
public boolean isbuildControlBar() {
return true;
}
// construct
public Video getResult() {
return video;
}
}
class FullBuilder extends VideoBuilder {
@Override
public void buildMenu() {
// TODO Auto-generated method stub
video.menu = "FullBuilderMenu";
System.out.println("buildMenu in FullBuilder");
}
@Override
public void buildPlaylist() {
// TODO Auto-generated method stub
video.playlist = "FullBuilderPlaylist";
System.out.println("buildPlaylist in FullBuilder");
}
@Override
public void buildMainWindow() {
// TODO Auto-generated method stub
video.mainWindow = "FullBuilderMainWindow";
System.out.println("buildMainMenu in FullBuilder");
}
@Override
public void buildControlBar() {
// TODO Auto-generated method stub
video.controlbar = "FullBuilderControlBar";
System.out.println("buildControlBar in FullBuilder");
}
}
class StreamlinedBuilder extends VideoBuilder {
@Override
public void buildMenu() {
// TODO Auto-generated method stub
video.menu = "StreamlinedBuilderMenu";
System.out.println("buildMenu in StreamlinedBuilder");
}
@Override
public void buildPlaylist() {
// TODO Auto-generated method stub
video.playlist = "StreamlinedBuilderPlaylist";
System.out.println("buildPlaylist in StreamlinedBuilder");
}
@Override
public void buildMainWindow() {
// TODO Auto-generated method stub
video.mainWindow = "StreamlinedBuilderMainWindow";
System.out.println("buildMainMenu in StreamlinedBuilder");
}
@Override
public void buildControlBar() {
// TODO Auto-generated method stub
video.controlbar = "StreamlinedBuilderControlBar";
System.out.println("buildControlBar in StreamlinedBuilder");
}
public boolean isbuildPlaylist() {
return false;
}
}
class MemoryBuilder extends VideoBuilder {
@Override
public void buildMenu() {
// TODO Auto-generated method stub
video.menu = "MemoryBuilderMenu";
System.out.println("buildMenu in MemoryBuilder");
}
@Override
public void buildPlaylist() {
// TODO Auto-generated method stub
video.playlist = "MemoryBuilderPlaylist";
System.out.println("buildPlaylist in MemoryBuilder");
}
@Override
public void buildMainWindow() {
// TODO Auto-generated method stub
video.mainWindow = "MemoryBuilderMainWindow";
System.out.println("buildMainMenu in MemoryBuilder");
}
@Override
public void buildControlBar() {
// TODO Auto-generated method stub
video.controlbar = "MemoryBuilderControlBar";
System.out.println("buildControlBar in MemoryBuilder");
}
}
class NetworkBuilder extends VideoBuilder {
@Override
public void buildMenu() {
// TODO Auto-generated method stub
video.menu = "NetworkBuilderMenu";
System.out.println("buildMenu in NetworkBuilder");
}
@Override
public void buildPlaylist() {
// TODO Auto-generated method stub
video.playlist = "NetworkBuilderPlaylist";
System.out.println("buildPlaylist in NetworkBuilder");
}
@Override
public void buildMainWindow() {
// TODO Auto-generated method stub
video.mainWindow = "NetworkBuilderMainWindow";
System.out.println("buildMainMenu in NetworkBuilder");
}
@Override
public void buildControlBar() {
// TODO Auto-generated method stub
video.controlbar = "NetworkBuilderControlBar";
System.out.println("buildControlBar in NetworkBuilder");
}
}
class BuilderDirector {
public Video constructor(VideoBuilder videoBuilder) {
if (videoBuilder.isbuildMenu())
videoBuilder.buildMenu();
if (videoBuilder.isbuildPlaylist())
videoBuilder.buildPlaylist();
if (videoBuilder.isbuildMainMenu())
videoBuilder.buildMainWindow();
if (videoBuilder.isbuildControlBar())
videoBuilder.buildControlBar();
return videoBuilder.getResult();
}
}
public class BuilderPatternTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
BuilderDirector builderDirector = new BuilderDirector();
VideoBuilder videoBuilder = new StreamlinedBuilder();
Video video = builderDirector.constructor(videoBuilder);
System.out.println(video.menu);
System.out.println(video.mainWindow);
System.out.println(video.playlist);
System.out.println(video.controlbar);
}
}
结果输出
buildMenu in StreamlinedBuilder
buildMainMenu in StreamlinedBuilder
buildControlBar in StreamlinedBuilder
StreamlinedBuilderMenu
StreamlinedBuilderMainWindow
null
StreamlinedBuilderControlBar
结论
- 建造者模式通过Director对Builder生产的Product的各个部分进行构造
- 可以简化建造者模式,将Director和Builder功能进行合并,即生产和组装功能合并