本帖最后由 大蓝鲸小蟀锅 于 2020-4-23 14:26 编辑
建造者模式(Builder Pattern)定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序,一般用来创建更为复杂的对象 实现方式(1)通过Client、Director、Builder和Product形成的建造者模式 (2)通过静态内部类方式实现零件无序装配话构造
第一种方式通过Client、Director、Builder和Product形成的建造者模式 抽象建造者(Builder):描述具体建造者的公共接口,一般用来定义建造细节的方法,并不涉及具体的对象部件的创建。 具体建造者(ConcreteBuilder):描述具体建造者,并实现抽象建造者公共接口。 指挥者(Director):调用具体建造者来创建复杂对象(产品)的各个部分,并按照一定顺序(流程)来建造复杂对象。 产品(Product):描述一个由一系列部件组成较为复杂的对象。
具体代码建造者 [Java] 纯文本查看 复制代码 [/align]/**
* Builder.java
* 建造者
*/
abstract class Builder {
//打地基
abstract void bulidA();
//扎钢筋
abstract void bulidB();
//铺电线
abstract void bulidC();
//装修
abstract void bulidD();
//完工
abstract Product getProduct();
}
产品 [Java] 纯文本查看 复制代码 [/align]/**
* Product.java
* 产品(大楼)
*/
public class Product {
private String buildA;
private String buildB;
private String buildC;
private String buildD;
public String getBuildA() {
return buildA;
}
public void setBuildA(String buildA) {
this.buildA = buildA;
}
public String getBuildB() {
return buildB;
}
public void setBuildB(String buildB) {
this.buildB = buildB;
}
public String getBuildC() {
return buildC;
}
public void setBuildC(String buildC) {
this.buildC = buildC;
}
public String getBuildD() {
return buildD;
}
public void setBuildD(String buildD) {
this.buildD = buildD;
}
@Override
public String toString() {
return buildA+"\n"+buildB+"\n"+buildC+"\n"+buildD+"\n"+"大楼完成";
}
}
具体建造者 [Java] 纯文本查看 复制代码 [/align]/**
* ConcreteBuilder.java
* 具体建造者
*/
public class ConcreteBuilder extends Builder{
private Product product;
public ConcreteBuilder() {
product = new Product();
}
@Override
void bulidA() {
product.setBuildA("打地基");
}
@Override
void bulidB() {
product.setBuildB("扎钢筋");
}
@Override
void bulidC() {
product.setBuildC("铺电线");
}
@Override
void bulidD() {
product.setBuildD("装修");
}
@Override
Product getProduct() {
return product;
}
}
指挥者 [Java] 纯文本查看 复制代码 [/align]/**
* Director.java
* 指挥者
*/
public class Director {
//指挥工人按顺序造大楼
public Product create(Builder builder) {
builder.bulidA();
builder.bulidB();
builder.bulidC();
builder.bulidD();
return builder.getProduct();
}
}
测试 [Java] 纯文本查看 复制代码 [/align]/**
* Test.java
* 测试类
*/
public class Test {
public static void main(String[] args) {
Director director = new Director();
Product create = director.create(new ConcreteBuilder());
System.out.println(create.toString());
}
}
第二种方式主要有三个角色:抽象建造者、具体建造者、产品 比第一种方式少了指挥者,主要是因为第二种方式把指挥者交给用户来操作,使得产品的创建更加简单灵活。 具体代码
[Java] 纯文本查看 复制代码 [align=left][color=rgb(51, 51, 51)][font="][size=16px][b]建造者[/b][/size][/font][/color][/align]/**
* Builder.java
* 建造者
*/
abstract class Builder {
//面包
abstract Builder bulidA(String mes);
//饮料
abstract Builder bulidB(String mes);
//鸡腿
abstract Builder bulidC(String mes);
//甜点
abstract Builder bulidD(String mes);
//获取套餐
abstract Product build();
}
产品 [Java] 纯文本查看 复制代码 [/align]/**
* Product.java
* 产品(套餐)
*/
public class Product {
private String buildA="面包";
private String buildB="饮料";
private String buildC="鸡腿";
private String buildD="甜点";
public String getBuildA() {
return buildA;
}
public void setBuildA(String buildA) {
this.buildA = buildA;
}
public String getBuildB() {
return buildB;
}
public void setBuildB(String buildB) {
this.buildB = buildB;
}
public String getBuildC() {
return buildC;
}
public void setBuildC(String buildC) {
this.buildC = buildC;
}
public String getBuildD() {
return buildD;
}
public void setBuildD(String buildD) {
this.buildD = buildD;
}
@Override
public String toString() {
return buildA+"\n"+buildB+"\n"+buildC+"\n"+buildD+"\n"+" 构成超级套餐";
}
}
具体建造者 [Java] 纯文本查看 复制代码 [/align]/**
* ConcreteBuilder.java
* 具体建造者(服务员)
*/
public class ConcreteBuilder extends Builder{
private Product product;
public ConcreteBuilder() {
product = new Product();
}
@Override
Product build() {
return product;
}
@Override
Builder bulidA(String mes) {
product.setBuildA(mes);
return this;
}
@Override
Builder bulidB(String mes) {
product.setBuildB(mes);
return this;
}
@Override
Builder bulidC(String mes) {
product.setBuildC(mes);
return this;
}
@Override
Builder bulidD(String mes) {
product.setBuildD(mes);
return this;
}
}
测试 [Java] 纯文本查看 复制代码 [/align]/** * Test.java * 测试类 */
public class Test
{
public static void main(String[] args) {
ConcreteBuilder concreteBuilder = new ConcreteBuilder();
Product build = concreteBuilder
.bulidA("面包")//
.bulidB("可乐")
.bulidD("蛋挞")
.build();
System.out.println(build.toString());
}
}
|