Java——建造者模式(Builder)

建造者模式(Builder)

1、建造者模式的定义

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

Builder模式是一步一步创建一个复杂对象的创建型模式,它允许使用者在不知道内部建造细节的情况下,可以更精细的控制对象的构造流程。该模式是为了将构建复杂对象的过程和它的部件解耦,是的构建过程和不见得表示隔离开来。

因为一个复杂的对象有很多大量组成部分,如电脑,有主机,显示器,操作系统,还有各种小零件等,如何将这些不见组建成一台电脑,这个装配过程很漫长,也很复杂,为了在构建过程中对外部隐藏实现细节,就可以使用Builder模式将部件和组装过程分离,使得构建过程和部件都可以自由扩展,两者之间的耦合也降到最低。

2、建造者模式优缺点

建造者模式是一种创建型设计模式。其主要优点如下:

产品的建造和表示分离,实现了解耦,可以使用相同的创建过程得到不同的产品。
将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰。(良好的封装性,不必知道内部组成的细节)
增加新的具体建造者无需修改原有类库的代码,易于拓展,符合“开闭原则“。
缺点:

产品必须有共同点,限制了使用范围。建造者模式创造出来的产品,其组成部分基本相同。如果产品之间的差异较大,则不适用这个模式。
产生多余的builder对象以及director对象,消耗内存。(如内部变化复杂,会有很多的建造类,难以维护)
适用环境:

相同的方法,不同的执行顺序,产生不同的事件结果。
对各部件或零件,都可以配到一个对象中,但是产生的运行结果又不相同时。
产品类非常复杂,或者产品类中的调用顺序不同产生了不同的结果,这个时候使用创建者模式非常合适。
当初始化一个对象特别复杂,如参数多,且很多参数都有默认值时(一个类有多个构造函数的时候,可以考虑使用建造者模式)
需要生成的产品对象有复杂的内部结构,这些产品对象具备共性;
隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。
需要生成的对象内部属性本身相互依赖。

img

3、建造者模式角色

builder(抽象接口): 为创建一个产品对象的各个部件指定抽象接口。

ConcreteBuilder(抽象接口的具体实现): 实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并提供一个检索产品的接口。

Director(接口的构造者和使用者): 构造一个使用Builder接口的对象。

Product(被构造的复杂对象): ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

重点(相比于普通JavaBean的好处):

在建造者模式中,提供一个辅助的静态建造器Builder(静态内部类),可以在里面set实体类的属性,与JavaBean不同的是,建造者是先set,在通过build实例化实体类,这样既可以提高代码的阅读性,也可以防止对象没有实例化,就被调用;不会造成不一致性,同时解决了Javabean模式的线程安全问题。

总结:Director角色并非多余,能把复杂的Product创建过程对外隐藏,使Builder部件和创建过程分离,各方易于扩展,降低了耦合度。当需要对一个对象设置很多属性,此时就能方便的使用链式调用来提高编码速度和代码可读性。

4、传统方式
package dome;

/**
 * 传统模式 盖房子
 */
public  class House {

    public void Brickwork(){
        System.err.println("砌墙");
    }

    public void Roofing(){
        System.err.println("盖屋顶");
    }

    public void floor(){
        System.err.println("铺地板");
    }

    //完成盖房子
    public void HouseBuilder(){
        Brickwork();
        Roofing();
        floor();
    }
}
package dome;

public class HeigHouse extends House{
    @Override
    public void Brickwork() {
        super.Brickwork();
    }

    @Override
    public void Roofing() {
        super.Roofing();
    }

    @Override
    public void floor() {
        super.floor();
    }

    @Override
    public void HouseBuilder() {
        super.HouseBuilder();
    }
}

package dome;

public class Test {
    public static void main(String[] args) {
        /***
         * 传统方式 建造过程和建造融合在一起 耦合性太强 使用建造者模式其实就是为了解耦
         */
        HeigHouse heigHouse = new HeigHouse();
        heigHouse.HouseBuilder();
    }
}

5、建造者模式
package builders;

public class Product {
    private String brickwork;
    private String roofing;
    private String floor;

    public String getBrickwork() {
        return brickwork;
    }

    public void setBrickwork(String brickwork) {
        this.brickwork = brickwork;
    }

    public String getRoofing() {
        return roofing;
    }

    public void setRoofing(String roofing) {
        this.roofing = roofing;
    }

    public String getFloor() {
        return floor;
    }

    public void setFloor(String floor) {
        this.floor = floor;
    }
}
package builders;

public abstract class HouseBuilder {
     //产品
     Product product = new Product();
     //砌墙
     abstract void Brickwork();
     //盖屋顶
     abstract void Roofing();
     //铺地板
     abstract void floor();

     //建造完成之后返回一个产品
    Product getProduct(){
        return product;
    }
}
package builders;

public class HeigHouse extends HouseBuilder{
    @Override
    void Brickwork() {
        System.err.println("建造者砌墙");
    }

    @Override
    void Roofing() {
        System.err.println("建造者盖屋顶");
    }

    @Override
    void floor() {
        System.err.println("建造者铺地板");
    }
}
package builders;

public class Cilent {
    HouseBuilder houseBuilder;

    public void setHouseBuilder(HouseBuilder houseBuilder) {
        this.houseBuilder = houseBuilder;
    }

    public Product getHouseBuilder(){
        houseBuilder.Roofing();
        houseBuilder.floor();
        houseBuilder.Brickwork();
        return houseBuilder.getProduct();
    }
}

package builders;

public class Test {
    public static void main(String[] args) {
        //具体建造者
        HouseBuilder houseBuilder = new HeigHouse();
        //使用者
        Cilent cilent = new Cilent();
        cilent.setHouseBuilder(houseBuilder); //开始建造
        cilent.getHouseBuilder(); //用户获取房子
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值