建造者模式
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式的四个角色:
Product(产品):具体的产品对象
AbstractBuilder(抽象建造者):创建Product对象的各个零件指定的接口/抽象类
Builder(具体建造者):实现接口,构建和装配个零件
Director(指挥者):使用Builder接口的对象。用于创建复杂对象。负责控制产品生产过程,隔离客户和对象的生产过程
UML:

Cast:(局域网使用分层设计模型,将网络功能划分为接入层、分布层和核心层。)
以校园网和企业网的构建为例:
抽象builder:
1 public interface LANBuilder { 2 void buildAccessLayer(); // 接入层 3 void buildDistributionLayer(); // 分布层 4 void buildCoreLayer(); // 核心层 5 LAN buildNetwork(); 6 }
校园网builder:
1 public class CampusLANBuilder implements LANBuilder { 2 3 CampusLAN campusLAN; 4 5 public CampusLANBuilder() { 6 this.campusLAN = new CampusLAN(); 7 campusLAN.type = "校园网"; 8 } 9 10 @Override 11 public void buildAccessLayer() { 12 campusLAN.setAccessLayer(campusLAN.type + "接入层"); 13 } 14 15 @Override 16 public void buildDistributionLayer() { 17 campusLAN.setDistributionLayer(campusLAN.type + "分布层"); 18 } 19 20 @Override 21 public void buildCoreLayer() { 22 campusLAN.setCoreLayer(campusLAN.type + "核心层"); 23 } 24 25 @Override 26 public LAN buildNetwork() { 27 return campusLAN; 28 } 29 }
企业网builder:
1 public class EnterpriseLANBuilder implements LANBuilder { 2 3 EnterpriseLAN enterpriseLAN; 4 5 public EnterpriseLANBuilder() { 6 this.enterpriseLAN = new EnterpriseLAN(); 7 enterpriseLAN.type = "企业网"; 8 } 9 10 @Override 11 public void buildAccessLayer() { 12 enterpriseLAN.setAccessLayer(enterpriseLAN.type + "接入层"); 13 } 14 15 @Override 16 public void buildDistributionLayer() { 17 enterpriseLAN.setDistributionLayer(enterpriseLAN.type + "分布层"); 18 } 19 20 @Override 21 public void buildCoreLayer() { 22 enterpriseLAN.setCoreLayer(enterpriseLAN.type + "核心层"); 23 } 24 25 @Override 26 public LAN buildNetwork() { 27 return enterpriseLAN; 28 } 29 }
Director:
1 public class LANDirector { 2 LANBuilder lanBuilder = null; 3 4 public LANDirector() { 5 } 6 7 // 构造器传入 builder 8 public LANDirector(LANBuilder lanBuilder) { 9 this.lanBuilder = lanBuilder; 10 } 11 12 // setter 传入 builder 13 public void setLanBuilder(LANBuilder lanBuilder) { 14 this.lanBuilder = lanBuilder; 15 } 16 17 public LAN constructLAN() { 18 lanBuilder.buildAccessLayer(); 19 lanBuilder.buildDistributionLayer(); 20 lanBuilder.buildCoreLayer(); 21 return lanBuilder.buildNetwork(); 22 } 23 }
局域网(AbstractProduct)
public class LAN { protected String type; protected String AccessLayer; protected String DistributionLayer; protected String CoreLayer; public void setAccessLayer(String accessLayer) { this.AccessLayer = accessLayer; } public void setDistributionLayer(String distributionLayer) { this.DistributionLayer = distributionLayer; } public void setCoreLayer(String coreLayer) { this.CoreLayer = coreLayer; } @Override public String toString() { return AccessLayer + '\n' + DistributionLayer + '\n' + CoreLayer; } }
校园网:
1 public class CampusLAN extends LAN { 2 }
企业网:
1 public class EnterpriseLAN extends LAN { 2 }
Main:
public class Main { public static void main(String[] args) { // 校园网 LANDirector d1 = new LANDirector(new CampusLANBuilder()); CampusLAN campusLAN = (CampusLAN) d1.constructLAN(); System.out.println(campusLAN); // 企业网 System.out.println("-------------"); LANDirector d2 = new LANDirector(new EnterpriseLANBuilder()); EnterpriseLAN enterpriseLAN = (EnterpriseLAN) d2.constructLAN(); System.out.println(enterpriseLAN); } }

PS:若只需要一个具体Builder,可以省略掉AbstractBuilder。还可以进一步省略掉Director,让Builder自己扮演Director和Builder双重角色。
如StringBuilder:

Appendable为抽象建造者,定义了 append() 抽象方法


AbstractStringBuilder 实现了 append() 方法


Stringbuilder 充当 Director 和 builder,继承AbstractBuilder


浙公网安备 33010602011771号