设计模式之–建造者模式 与 变种建造者模式
简介:
本篇文章是介绍 23 中设计模式中的 建造者模式 与 变种建造者模式.使用的是 Java 代码.
目录:
1.什么是建造者模式
定义:
建造者模式也被称为生殖器模式…不是…是生成器模式.
将一个复杂对象的创建与它的表示分离, 使同样的创建过程可以创建不同的表示.
书上的原话总是让人万脸懵逼, 仔细想想上面那段话很简单. 按我的理解意思就是说通过建造者模式将构建一个对象的过程和用于构造这个对象的部件分离开来也就是解耦. 我们不需要知道他的构建过程, 我们只用每次都传进去不同的部件即可.
结构:
建造者模式有四个角色:
- Director: 导演类
负责安排已有模块的顺序, 然后通知 Builder 开始建造. 也是客户端调用的类.
- Builder: 抽象建造者类
规范产品的组建, 一般由子类实现.(也可以使用接口)
- ConcreteBulider: 具体建造者类
抽象 Builder 类定义的所有方法, 并且返回一个组建好的产品对象.
- Product: 产品类
用于建造的产品实体类
2.建造者模式的使用场景
常用与复杂对象的构建, 比如我们要组装一台电脑, 只要告诉商家什么牌子的 cpu, 什么牌子的内存条等等即可. 这些部件是可以根据我们的需求变化的. 但是组装成计算机的过程是一样的. 使得部件与组装的分离.使得构建过程和部件都可以自由拓展. 两者耦合也降到最低.
3.建造者模式的简单运用
产品类
public class Cookies {
private String shape;
public String getShape(){
return shape;
}
public void setShape(String shape){
this.shape = shape;
}
}
抽象 Builder 类
public interface Builder{
public void setShape();
public Cookies getCookies();
}
具体 Builder 类
public class SquareCookiesBuilder implements Builder{
private Cookies cookies;
@Override
public SquareCookiesBuilder(){
this.cookies = new Cookies();
}
@Override
public void setShape(){
this.cookies.setShape("方形");
}
@Override
public Cookies getCookies(){
return this.cookies;
}
}
导演类
public class Director {
private Builder builder;
public Director(Builder builder){
this.builder = builder;
}
public void createCookies(){
this.builder.setShape()
}
public Cookies getCookies(){
return this.builder.getCookies();
}
}
客户端使用
new Director(new SquareCookiesBuilder()).createCookies().getCookies()
4.变种建造者模式
我们在 Android 开发时经常会用到链式调用的工具类, 你也想写一个链式调用吧. 当然这种链式调用就是建造者模式的变种.
public class Person {
private final String name;
private final String gender;
private final String age;
private Person(Builder builder) {
name = builder.name;
gender = builder.gender;
age = builder.age;
}
public String getName() {
return name;
}
public String getGender() {
return gender;
}
public String getAge() {
return age;
}
public static final class Builder {
private String name;
private String gender;
private String age;
public Builder() {
}
public Builder name(String val) {
name = val;
return this;
}
public Builder gender(String val) {
gender = val;
return this;
}
public Builder age(String val) {
age = val;
return this;
}
public Person build() {
return new Person(this);
}
}
}
我们来解释一下上面的代码.
我们创建这个 Person 类. 我们私有化了 Person 类的构造方法, 可见他的构造方法一定要传一个 Builder 对象. 从而把 Builder 对象的属性都拿到.
我们的 Builder 类 就是核心所在. Builder 的构造方法是公开的. 我们要创建 Person 对象就一定要通过 Builder. 我们的位 Builder 设置参数时, 每次都会返回 Builder 对象. 这样就实现了链式调用, 设置完参数, 我们调用 Builder 对象的 build() 方法, 从而把 Builder 对象的参数传给 Person. 这样我们就构建了 Person 对象.
接下来看一下构建 Person 的实际代码:
new Person
.Builder()
.name("青蛙ing")
.gender("男")
.age("20")
.build();