1、什么是建造者模式?
建造者模式是一种较为复杂的创建型模式,它将客户与包含多个组成部分的复杂对象的创建过程分离,客户端无须知道复杂对象的内部组成部分与装配方式。只需知道所创建的类型。
建造者模式:将一个复杂对象的创建与它的表示分离,使得同样的构建过程可以创建不同的表示。
2、建造者模式结构
(1)Builder(抽象建造者)它为创建一个产品对象的各个部件指定抽象接口,在该接口中一般声明两类方法,一类是方法是buildPartX(),他们用于创建复杂对象的各个部件;另一类方法是getResult(),他们用于返回复杂对象。-----可以是接口,也可以抽象类。
(2)ConcreteBuilder(具体建造者):它实现Builder接口,实现各个部件的具体构造和装配方法,定义并明确所创建的复杂对象,还可以提供一个方法返回创建好复杂的产品对象。
(3)product(产品):它是被构建的复杂对象,包含多个组成部件,具体建造者创建该产品的内部表示并定义它的装配过程。
(4)Director(指挥者),复杂安排对象的建造次序,指挥者与抽象建造者之间存在关联关系,可以在其construct()建造方法中调用建造者对象的部件构造与装配方法,完成复杂对象的建造。客户端一般只与指挥者进行交互,在客户端确定具体建造者的类型,并实例化具体建造者对象,通过指挥类的构造函数或者setter方法将该对象传入指挥者类中。
3、建造者模式
<1>复杂产品对象--product
package com.xu.factory.builder;
/**
* 游戏角色类,充当复杂产品对象
*
* @author admin
*/
public class Actor {
/**
* 类型
*/
private String type;
/**
* 性别
*/
private String sex;
/**
* 脸型
*/
private String face;
/**
* 服装
*/
private String constume;
/**
* 发型
*/
private String hairstyle;
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 getConstume() {
return constume;
}
public void setConstume(String constume) {
this.constume = constume;
}
public String getHairstyle() {
return hairstyle;
}
public void setHairstyle(String hairstyle) {
this.hairstyle = hairstyle;
}
}
<2>抽象建造者
package com.xu.factory.builder;
/**
*游戏角色创造者,充当抽象建造者
* @author admin
*/
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();
public abstract void buildHairstyle();
public Actor createActor(){
return actor;
}
}
<3>具体建造者
package com.xu.factory.builder;
/**
* 具体建造者
*
* @author admin
*/
public class AngleBuilder 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.setConstume("白裙");
}
@Override
public void buildHairstyle() {
actor.setHairstyle("披肩长发");
}
}
package com.xu.factory.builder;
/**
* 具体建造者
* @author admin
*/
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.setConstume("黑衣");
}
@Override
public void buildHairstyle() {
actor.setHairstyle("光头");
}
}
package com.xu.factory.builder;
/**
* 具体建造者
*
* @author admin
*/
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.setConstume("盔甲");
}
@Override
public void buildHairstyle() {
actor.setHairstyle("飘逸");
}
}
<4>指挥者
package com.xu.factory.builder;
/**
* 角色控制器,指挥者
*
* @author admin
*/
public class ActorController {
public Actor consruct(ActorBuilder actorBuilder) {
Actor actor;
actorBuilder.buildCostume();
actorBuilder.buildFace();
actorBuilder.buildHairstyle();
actorBuilder.buildType();
actorBuilder.buildSex();
actor=actorBuilder.createActor();
return actor;
}
}
<5>客户端
package com.xu.factory.builder;
/**
* @author admin
*/
public class Client {
public static void main(String[] args) {
ActorBuilder ab;
//具体对象
ab=new AngleBuilder();
ActorController ac=new ActorController();
//通过指挥者创建对象
Actor consruct = ac.consruct(ab);
System.out.println("性别:"+consruct.getSex());
System.out.println("面容:"+consruct.getFace());
System.out.println("服装:"+consruct.getConstume());
System.out.println("发型:"+consruct.getHairstyle());
System.out.println("外观:"+consruct.getType());
}
}
运行结果
性别:女
面容:漂亮
服装:白裙
发型:披肩长发
外观:天使
4、建造者优缺点及适用环境
(1)、建造者模式主要优点
①在建造者模式中,客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程创建出不同的对象。
②每一个建造者相对独立,方便替换或增加新的具体建造者,
③可以精细的控制产品的创建过程,
(2)建造者模式的缺点
①建造者模式所创建的产品一般具有较多的共同点,如果差异性大,会受到较大的限制
②内部变化复杂,需要定义更多的建造者来实现变化,导致系统变化复杂,增加系统的理解难度和运行成本。