Day03-设计模式之建造者模式
设计模式之建造者模式
建造者模式介绍
-
建造者模式也属于创建型模式,它提供了一种创建对象的最佳方式。
-
意图:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
-
用户只需要给出指定复杂对象的类型和内容,建造者模式负责按顺序创建复杂对象(把内部的建造过程和细节隐藏起来)
-
建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。
类比举例
- 汽车购买者(用户)︰你只需要说出你需要的>型号(对象的类型和内容),然后直接购买就可以使用了(不需要知道汽车是怎么组装的(车轮、车门、发动机、方向盘等等)
角色分析
建造者模式的四个角色:
1、Product(产品角色):一个具体的产品对象
2、Builder(抽象建造者):创建一个Product对象的各个部件指定的接口。
3、ConcreteBuilder(具体的建造者):实现接口,构建和装配各个部件。
4、Director(指挥者): 构建一个使用Builder接口的对象。它主要是用于创建一个复杂的对象。它主要有两个作用,一是:隔离了客户与对象的生产过程,二是:负责控制产品对象的生产过程。

既然是建造者模式,那么可以以造房子为例子。假设造房简化为步骤:(1)地基 (2)钢筋工程 (3)铺电线 (4)粉刷;“如果”要盖一座房子,首先要找一个建筑公司或工程承包商(指挥者)。承包商指挥工人(具体建造者)过来造房子(产品),最后验收。
代码例子
package day03.builder;
/**
* @author coolsheep
* @date 2023/2/27 20:03
* @Describe 定义建造者的方法
*/
public interface Builder {
void buildA();//地基
void buildB();//钢筋工程
void buildC();//铺电线
void buildD();//粉刷
//完工:得到产品
Product getProduct();
}
package day03.builder;
/**
* @author coolsheep
* @date 2023/2/27 20:48
* @Describe 具体的建造者:工人
*/
public class Worker implements Builder{
private Product product;
//工人负责创建产品
public Worker() {
product = new Product();
}
@Override
public void buildA() {
product.setBuildA("地基");
System.out.println("地基");
}
@Override
public void buildB() {
product.setBuildB("钢筋工程");
System.out.println("钢筋工程");
}
@Override
public void buildC() {
product.setBuildC("铺电线");
System.out.println("铺电线");
}
@Override
public void buildD() {
product.setBuildD("粉刷");
System.out.println("粉刷");
}
@Override
public Product getProduct() {
return product;
}
}
package day03.builder;
import lombok.Data;
/**
* @author coolsheep
* @date 2023/2/27 20:05
* @Describe
*/
//产品:房子
@Data
public class Product {
private String buildA;
private String buildB;
private String buildC;
private String buildD;
}
package day03.builder;
/**
* @author coolsheep
* @date 2023/2/27 20:53
* @Describe 指挥:核心。负责指挥构建一个工程,工程如何创建,由它决定
*/
public class Director {
//指挥工人安装顺序建房子
public Product build(Builder builder) {
builder.buildA();
builder.buildB();
builder.buildC();
builder.buildD();
return builder.getProduct();
}
}
package day03.builder;
/**
* @author coolsheep
* @date 2023/2/27 20:57
* @Describe
*/
public class Test {
public static void main(String[] args) {
//指挥
Director director = new Director();
//指挥 具体的工人完成产品
Product build = director.build(new Worker());
System.out.printf(build.toString));
}
}
-
上面示例是Builder模式的常规用法,导演类Director在Builder模式中具有很重要的作用,它用于指导具体构建者如何构建产品,控制调用先后次序,并向调用者返回完整的产品类,但是有些情况下需要简化系统结构,可以把Director和抽象建造者进行结合。
-
内部有复杂对象的默认实现,使用时可以根据用户需求自由定义更改内容,并且无需改变具体的构造方式。就可以生产出不同复杂产品
应用场景
需要生成的产品对象有复杂的内部结构,这些产品对象具备共性;
隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。适合于一个具有较多的零件(属性)的产品(对象)的创建过程。
建造者模式的注意事项
1)客户端(使用程序)不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
2)每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。
3)可以更加精细地控制产品的创建过程。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。
4)增加新的具体建造者无须修改原有类库的代码,指挥者类针对抽象建造者类编程,系统扩展方便。

浙公网安备 33010602011771号