前言:
隔离好多好多天,我又回来了,因为之前搬校区还有自己写的一款校园应用突然火了起来,疯狂的修修补补还有就是进行功能的完善,所以忙了一段时间,今天我又回来了。(新校区是真的打,但是好多设施还没有完善起来。。。。。),那我们就直接进入下一个设计模式!
一、何为建造者模式?
- 建造者模式(Builder): 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。简单来说就是,如果我们用了建造者模式,那么用户就只需要指定需要的类型就可以得到他们,而具体建造的过程和细节就不需知道了。
- 建造者模式的结构图:
从上诉的UML类图,我们能够很容易的理解建造者模式的概念,当我们试图构建一个具体的产品Product的时候,按照我们的传统,我们就会去直接new Product() 并且get、set设置这些属性,但是,如果当我们遇上了,Product的同类产品(不同表现)也就是构建的具体过程是一样的,只是里面的参数或者属性不一样(也就是细节),是否我们可以把这个构建的过程给抽象出来,所以就抽象出来了Builder接口表示具体构造的抽象,而具体的构造的细节在实现类ConcreteBuilder重写的方法中,针对同样的构成不同的细节实现,我们就可以采用实现Builder接口去重写里面的方法区实现了。但是这时候我们试想,如果当Product产品的构建的过程有多个部件(方法)的时候,这时候我们在客户端new ConcreteBuilder()的对象,是否还是需要一个一个调用其对象的方法区构建,这样使用者还是看见了具体的构建过程,如果做到分离呢??这时候就用到一个具体类去去指挥它的构建过程了这个类就叫做指挥者Director
二、建造者模式的作用
- 复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示的意图
- 使用建造者模式,用户只需要指定建造的类型就可以得到它们,而具体建造的过程和细节就不需知道了。
三、建造者模式的代码实现
下面我将会具一个具体的例子来说明建造者模式: 一个具体的产品 Person(类) 人,里面存放这个一个属性featureList,存放着这个人的不同特征,还有一些方法,就是构造这些特征的烦方法。我需要构建一个胖的一个瘦的,而构建的过程的抽象在一个Builder的抽象类或者接口之中存放,这个两个人,只要是人,构造的过程都是一样的,但是就是具体的细节不一样,这时候我们需要有一个FactBuilder和一个ThinBuilder 分别实现Builder的抽象,而需要一个Director去指挥具体的构建过程。
package com.justreading.gof;
import java.util.ArrayList;
import java.util.List;
/**
* @author LYJ
* @Description
* @date 2020 年 07 月 07 日 19:14
*/
//产品
class Person{
private List<Object> featureList = new ArrayList<>();
/**
* 往featureList里面添加特征的方法
* @param object
*/
public void addFeature(Object object){
featureList.add(object);
}
/**
* 展示具体的特征的方法
*/
public void showFeature(){
System.out.println(featureList);
}
}
//建造的抽象
abstract class Builder{
/**
* 构造体重特征
*/
public abstract void builderWeight();
/**
* 构造运动特征
*/
public abstract void builderSport();
/**
* 得到具体构建的对象
*/
public abstract Person getResult();
}
//瘦子的具体构造者
class ThinBuilder extends Builder{
private Person person = new Person();
@Override
public void builderWeight() {
person.addFeature("瘦子很轻");
}
@Override
public void builderSport() {
person.addFeature("瘦子运动多");
}
@Override
public Person getResult() {
return person;
}
}
//胖子的具体建造者
class FactBuilder extends Builder{
private Person person = new Person();
@Override
public void builderWeight() {
person.addFeature("胖子很重");
}
@Override
public void builderSport() {
person.addFeature("胖子运动少");
}
@Override
public Person getResult() {
return person;
}
}
//指挥者--指挥构造
class Director{
public void construct(Builder builder){
builder.builderWeight();
builder.builderSport();
}
}
//测试
public class BuilderGofMain {
public static void main(String[] args) {
Director director = new Director();
ThinBuilder thinBuilder = new ThinBuilder();
FactBuilder factBuilder = new FactBuilder();
director.construct(thinBuilder);
director.construct(factBuilder);
//获取构造的对象
Person thinPerson = thinBuilder.getResult();
Person factPerson = factBuilder.getResult();
//展示构造的对象的不同特征
thinPerson.showFeature();
factPerson.showFeature();
}
}
运行结果:
四、建造者模式的应用场景
- 主要是用于创建一些负责的对象,这些对象内部构建间的建造顺序通常是稳定的,但是对象内部的构建通常面临着复杂的变换。
- 建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方式时使用的模式。
五、总结
1、建造者模式: 复杂对象的创建与它的表示进行分离,使得同样的构建可以创建不同的表示
2、UML类图
3、胖子瘦子例子