jave设计模式---建造者模式

建造者模式是一种创建型设计模式,它将复杂对象的构建与其表示分离,使构建过程能独立于表示。该模式定义了一个构建抽象接口,包含创建产品对象各个部分的方法,还提供了一个返回完整产品的方法。具体建造者实现这个接口,负责组装产品。指挥者协调建造过程,客户端通过指挥者来创建产品,而不需要了解内部细节。
摘要由CSDN通过智能技术生成

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)建造者模式的缺点

①建造者模式所创建的产品一般具有较多的共同点,如果差异性大,会受到较大的限制

②内部变化复杂,需要定义更多的建造者来实现变化,导致系统变化复杂,增加系统的理解难度和运行成本。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值