建造者模式

建造者模式(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 }
View Code

校园网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 }
View Code

企业网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 }
View Code

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 }
View Code

局域网(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;
    }
}
View Code

校园网:

1 public class CampusLAN extends LAN {
2 }
View Code

企业网:

1 public class EnterpriseLAN extends LAN {
2 }
View Code

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);
    }
}
View Code

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

如StringBuilder:

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

 

AbstractStringBuilder 实现了 append() 方法

Stringbuilder 充当 Director 和 builder,继承AbstractBuilder

 

posted @ 2020-08-07 02:26  whyha  阅读(118)  评论(0)    收藏  举报