建造者(Builder)模式的定义:
指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。
该模式的主要优点如下:
• 各个具体的建造者相互独立,有利于系统的扩展。
• 客户端不必知道产品内部组成的细节,便于控制细节风险。
其缺点如下:
• 产品的组成部分必须相同,这限制了其使用范围。
• 如果产品的内部变化复杂,该模式会增加很多的建造者类。
建造者(Builder)模式和工厂模式的关注点不同:
- 建造者模式
注重零部件的组装过程
, - 而工厂方法模式更
注重零部件的创建过程
,但两者可以结合使用。
模式的结构
建造者(Builder)模式的主要角色如下。
-
产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个滅部件。
-
抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()。
-
具体建造者(Concrete Builder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。
-
指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。
为什么要使用抽象建造者,不直接使用具体创造者?
- 稳定创建过程:使用接口或者抽象类时,子类继承或实现,一定会实现父类方法,而如果不使用的话,在写具体创造者的过程中可能因为马虎,造成每一个具体实现类有可能不一样。
接下来我用UML类图展示建筑者模式的结构
下面我来用代码演示过程
1. Human 产品类
package com.ncst.bulider;
/**
* @Date 2020/8/8 14:54
* @Author by LiShiYan
* @Descaption
*/
public class Human {
private String eye;
private String mouth;
private String leg;
public String getEye() {
return eye;
}
public void setEye(String eye) {
this.eye = eye;
}
public String getMouth() {
return mouth;
}
public void setMouth(String mouth) {
this.mouth = mouth;
}
public String getLeg() {
return leg;
}
public void setLeg(String leg) {
this.leg = leg;
}
@Override
public String toString() {
return "Human{" +
"eye='" + eye + '\'' +
", mouth='" + mouth + '\'' +
", leg='" + leg + '\'' +
'}';
}
}
2.HumanBuilder 抽象建筑者接口
package com.ncst.bulider;
/**
* @Date 2020/8/8 14:52
* @Author by LiShiYan
* @Descaption
*/
public interface HumanBuilder {
void setEye();
void setLeg();
void setMouth();
//返回人的身体
Human getBOdy();
}
3.BlackHuman 具体建造者1
package com.ncst.bulider;
/**
* @Date 2020/8/8 14:58
* @Author by LiShiYan
* @Descaption
*/
public class YellowHuman implements HumanBuilder {
private Human human = new Human();
@Override
public void setEye() {
human.setEye("黑黑的眼睛");
}
@Override
public void setLeg() {
human.setLeg("长长的腿");
}
@Override
public void setMouth() {
human.setMouth("红红的嘴");
}
@Override
public Human getBOdy() {
return human;
}
}
BlackHuman 具体建筑者2
package com.ncst.bulider;
/**
* @Date 2020/8/8 14:58
* @Author by LiShiYan
* @Descaption
*/
public class BlackHuman implements HumanBuilder {
private Human human = new Human();
@Override
public void setEye() {
human.setEye("蓝蓝的眼睛");
}
@Override
public void setLeg() {
human.setLeg("短短的腿");
}
@Override
public void setMouth() {
human.setMouth("黑黑的嘴");
}
@Override
public Human getBOdy() {
return human;
}
}
4.DIrector 指挥者
package com.ncst.bulider;
/**
* @Date 2020/8/8 15:10
* @Author by LiShiYan
* @Descaption
*/
public class Director {
public Human build(HumanBuilder humanBuilder) {
humanBuilder.setEye();
humanBuilder.setMouth();
humanBuilder.setLeg();
return humanBuilder.getBOdy();
}
}
5.Client测试类,
我们使用建造者模式,当添加一个新类,如白种人类,会非常简单,符合OCP原则
添加白种人类如法炮制不在演示
package com.ncst.bulider;
/**
* @Date 2020/8/8 15:09
* @Author by LiShiYan
* @Descaption
*/
public class Client {
public static void main(String[] args) {
Human black = new Director().build(new BlackHuman());
System.out.println("黑种人"+black);
//新添加一个白种人
Human white=new Director().build(new WhiteHuman());
System.out.println("白种人"+white);
}
}
测试结果