个人整合学习自
- 《Java设计模式》 刘伟 编著
模式概述
Builder Pattern: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。也是一种创建型模式。
- Builder(抽象建造者):接口、抽象类,一般包括builderPartX()和getResult()两种方法
- ConcreteBuilder(具体创建者):实现类
- Product(产品):被构建的复杂对象
- Director(指挥者):负责安排负责对象的建造次序,内写construct()建造方法中调用建造者对象的部件的构造或者装配方法,完成复杂对象的构建。
案例
- 汽车有很多组件,如方向盘,发动机,轮胎等,将创建和组装分开。关照一步一步地创建一个包含多个组成部分的复杂对象。
- 游戏的角色:有英雄、天使、恶魔等角色,以下也是使用这个做实例。
package xyz.cglzwz.designpattern.bp;
/**
* 游戏角色创建者,充当抽象创建者
*
* @author chgl16
* @date 2019-03-13
*/
public abstract class ActorBuilder {
// 让具体的创建者类调用这个对象
protected Actor actor = new Actor();
public abstract void buildType();
public abstract void buildSex();
public abstract void buildFace();
public abstract void buildCostume();
/**
* 工厂方法,返回一个完整的游戏角色
*
* @return
*/
public Actor createActor() {
return actor;
}
}
package xyz.cglzwz.designpattern.bp;
/**
* 英雄角色创建者,充当具体创建者
*
* @author chgl16
* @date 2019-03-13
*/
public class HeroBuilder extends ActorBuilder {
@Override
public void buildType() {
// 调用父类的对象
actor.setType("英雄");
}
@Override
public void buildSex() {
actor.setSex("男");
}
@Override
public void buildFace() {
actor.setFace("英俊");
}
@Override
public void buildCostume() {
actor.setCostume("汉服");
}
}
package xyz.cglzwz.designpattern.bp;
/**
* 天使角色创建者,充当具体创建者
*
* @author chgl16
* @date 2019-03-13
*/
public class AngelBuilder extends ActorBuilder {
@Override
public void buildType() {
actor.setType("天使");
}
@Override
public void buildSex() {
actor.setSex("女");
}
@Override
public void buildFace() {
actor.setFace("美丽");
}
@Override
public void buildCostume() {
actor.setCostume("白裙");
}
}
package xyz.cglzwz.designpattern.bp;
/**
* 恶魔角色创建者,充当具体创建者
*
* @author chgl16
* @date 2019-03-13
*/
public class DevilBuilder extends ActorBuilder {
@Override
public void buildType() {
// 调用父类的对象
actor.setType("恶魔");
}
@Override
public void buildSex() {
actor.setSex("男");
}
@Override
public void buildFace() {
actor.setFace("恐怖");
}
@Override
public void buildCostume() {
actor.setCostume("黑衣");
}
}
package xyz.cglzwz.designpattern.bp;
/**
* 游戏角色类,充当复杂产品对象
*
* @author chgl16
* @date 2019-03-13
*/
public class Actor {
// 角色类型
private String type;
// 性别
private String sex;
// 脸型
private String face;
// 服装
private String costume;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getFace() {
return face;
}
public void setFace(String face) {
this.face = face;
}
public String getCostume() {
return costume;
}
public void setCostume(String costume) {
this.costume = costume;
}
}
package xyz.cglzwz.designpattern.bp;
/**
* 角色控制器,充当指挥者
*
* @author chgl16
* @date 2019-03-13
*/
public class ActorController {
/**
* 逐步构造复杂产品对象
*
* @param actorBuilder
* @return
*/
public Actor construct(ActorBuilder actorBuilder) {
actorBuilder.buildType();
actorBuilder.buildSex();
actorBuilder.buildFace();
actorBuilder.buildCostume();
return actorBuilder.createActor();
}
}
package xyz.cglzwz.designpattern.bp;
public class App {
public static void main(String[] args) {
ActorBuilder actorBuilder = new HeroBuilder();
ActorController ac = new ActorController();
Actor actor = ac.construct(actorBuilder);
System.out.println(actor.getType());
System.out.println(actor.getSex());
System.out.println(actor.getFace());
System.out.println(actor.getCostume());
System.out.println("--------------");
// 切换为创建天使
actorBuilder = new AngelBuilder();
actor = ac.construct(actorBuilder);
System.out.println(actor.getType());
System.out.println(actor.getSex());
System.out.println(actor.getFace());
System.out.println(actor.getCostume());
}
}
英雄
男
英俊
汉服
--------------
天使
女
美丽
白裙
优缺点
优点
- 客户端不必要知道产品内部组成的细节,将产品本身与产品的创建过程解耦,可以创建多种不同产品。
- 具体建造者相互独立,方便。需要新增即可,满足开闭原则。
缺点
- 要求不同产品的共同点要很多,组件很类似,不然差异大的话,不适合了