建造者模式 / 生成器模式


基本介绍

1.建造者模式,又叫生成器模式

2.将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象

 

事项

1.优点

(1)易于解耦:客户端不需要知道内部的具体构建细节,将产品本身与创建过程进行解耦,允许用户只通过指定复杂对象的类型和内容就构建对象,使用相同的创建过程来得到不同的产品,符合依赖倒转原则

(2)易于精准控制对象的创建:将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰

(3)易于扩展:增加新的具体构建者无需修改原有的代码,易于扩展,符合开闭原则

2.缺点

(1)建造者模式所创建的产品一般具有较多的共同点,其组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式,其使用范围受到一定的限制

(2)如果产品的内部变化复杂,导致需要定义很多具体建造者类来实现这种变化,导致系统变得庞大

3.抽象工厂模式、建造者模式

(1)抽象工厂模式:实现对产品家族的创建,一个产品家族是一系列产品,具有不同分类维度的产品组合,采用抽象工厂模式不需要关心构建过程,只关心什么产品由什么工厂生产即可

(2)建造者模式:要求按照指定的规范建造产品,主要目的是通过组装零配件而产生一个新产品

4.应用场景

(1)需要生成的产品对象有复杂的内部结构,这些产品对象具备共性

(2)隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品

(3)需要生成的对象内部属性本身相互依赖

 

四种角色

1.产品: 一个具体的产品对象

2.抽象建造者: 创建一个产品对象的各个部件指定的接口/抽象类

(1)规范具体建造者的方法

(2)是多个规范相同的具体建造者的抽象

3.具体建造者: 实现接口/继承抽象类

(1)在规范下,实现具体的建造方法

(2)一个具体建造者对应一个具体产品

4.指挥者: 构建一个使用抽象建造者的对象

(1)隔离客户端与产品对象的生产过程

(2)控制产品对象的生产流程

(3)所有具体建造者的生产流程一致

 

JDK 中的 StringBuilder

1.Appendable 接口定义了多个 append 方法(抽象方法), 即 Appendable 为抽象建造者, 定义了抽象方法

2. AbstractStringBuilder 实现了 Appendable 接口方法,AbstractStringBuilder 已经是具体建造者,但不能实例化

3.StringBuilder 即充当了指挥者,同时充当了具体建造者,因为 StringBuilder 继承了 AbstractStringBuilder,建造方法的实现由 AbstractStringBuilder 完成

 

代码示例

public class Builder {//客户端

    public static void main(String[] args) {
        //创建指挥者
        Director director = new Director();
        //传入具体建造者
        director.setAbstractBuilder(new ConcreteBuilder());
        //生产产品并接收
        Product product = director.build();
    }
}

class Director {//指挥者
    public AbstractBuilder abstractBuilder;

    //传入具体建造者,决定创建哪种产品
    public void setAbstractBuilder(AbstractBuilder abstractBuilder) {
        this.abstractBuilder = abstractBuilder;
    }

    //控制产品的生产流程
    public Product build() {
        abstractBuilder.Step();
        return abstractBuilder.finish();
    }
}

abstract class AbstractBuilder {//抽象建造者
    public Product product = new Product();//初始化时是未完成品

    //规范建造方法
    public abstract void Step();

    //建造完成,返回产品
    public Product finish() {
        return product;
    }
}

class ConcreteBuilder extends AbstractBuilder {//Product的具体建造者

    //实现建造方法
    public void Step() {
    }
}

class Product {//产品
}

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM