Builder模式
Builder模式是一步一步创建一个复杂对象的创建型模式,允许用户在不知道内部构建细节的情况下,可以更精细的控制对象的构造流程。也就是针对于不同的对象,在不知道构建细节的情况下,通过不同的构建实现过程,得到不同的结果。
Builder模式的定义
将一根复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
Builder模式的使用场景
1、相同的方法,不同的执行顺序,产生不同的事件结果。
2、多个部件都可以装配到一个对象中,但是产生的运行结果不同。
3、产品类非常复杂,或者产品类的调用舒心产生不同的作用。
4、当初始化一个对象特别复杂,如参数多,切很多参数具有默认值。
场景举例:
Builder模式UML图
角色介绍:
Product:产品类
Builder:抽象Builder类,规范产品的组建,一般由子类实现。
ConcreteBuilder:继承Builder抽象类,实现类。
Director:统一组装过程。
Builder模式的简单实现
场景:计算机组装,通过计算机主机,操作系统,显示器组件进行举例,通过Director和具体Builder来组建计算机对象。
实例代码如下:
public abstract class Computer { protected String mBoard; protected String mDisplay; protected String mOS; public Computer(){} //设置CPU核心数 public void setBoard(String board) { mBoard=board; } //设置内存 public void setDisplay(String display) { mDisplay=display; } //设置OS public abstract void setOS(); }
/*** HP电脑 **/ public class HPBook extends Computer { public HPBook(){} @Overrider public void setOS() { mOS="Windows 10"; } }
/****抽象Builder类***/ public abstract class Builder { //设置主机 public abstract void buildBoard(String board); //设置显示器 public abstract void buildDisplay(String display); //设置操作系统 public abstract void buildOS(); //创建计算机 public abstract Computer createComputer(); }
/***具体实现Builder类***/ public class HPBuilder extends Builder { private Computer mCompter=new HPBook(); @Overrider public void buildBoard(String board) { mComputer.setBoard(board); } @Overrider public void setbuildDisplay(String display) { mComputer.setDisplay(display); } @Overrider public void builOS() { mComputer.setOS(); } @Overrider public Computer createComputer() { return mComputer; } }
/****组装类***/ public class Director { Builder builder=null; public Director(Builder builder) { this.builder=builder; } public void construct(String board,String display) { builder.buildBoard(board); builder.buildDisplay(display); builder.buildOS(); } }
public class Test { public static void main(String[] args) { //构建器 Builder builder=new HPbookBuilder(); //组装 Director PC_Director=new Director(builder); PC_Director.construct("华硕主板","三星显示器"); System.out.println(builder.createComputer().toString()); } }