>  기사  >  Java  >  Java 디자인 패턴 - 빌더 패턴

Java 디자인 패턴 - 빌더 패턴

坏嘻嘻
坏嘻嘻원래의
2018-09-14 14:25:381278검색

이 글에서는 주로 Builder의 사용법을 소개합니다. 참고할 수 있도록 모든 사람과 공유하세요. 자세한 내용은 다음과 같습니다.

최근 Mybatis의 소스코드를 살펴보던 중 XML 구성 파일을 읽고 파싱하는 과정에서 발견한 내용은 다음과 같습니다. 빌더 모드가 사용되었습니다. 따라서 나는 이 디자인 패턴을 검토할 계획이다. Mybatis的源码, 在阅读解析 XML 配置文件的过程中, 发现使用到了建造者(Builder)模式。 因此, 打算重温一下该设计模式。

由来

假设我们需要画一个小人, 我们可能会有以下的构造函数定义:

public Person(HeadType headType, HairType hairType, HairColor hairColor, FaceType faceType, BodyType bodyType, ArmType amrType, LegType legTyype) {
}

看到这么一个构造函数, 估计我们自己以后回来看的时候都懵了, 这么多参数, 导致我们后续的维护也很麻烦。

而构造模式就可以解决此类的问题。

使用

目标是画一个小人

1. 定义抽象 Builder

先定义抽象的PersonBuilder。 该类定义了画小人需要的步骤, 这样每个通过PersonBuilder产生的对象本质上就都是一样的了, 只不过个性上可以不一样。

abstract class PersonBuilder {
    protected Graphics graphics;

    public PersonBuilder(Graphics graphics) {
        this.graphics = graphics;
    }

    public abstract void buildHead();
    public abstract void buildBody();
    public abstract void buildArmLeft();
    public abstract void buildArmRight();
    public abstract void buildLegLeft();
    public abstract void buildLegRight();
}

2. 定义具体 Builder

在定义一个具体的实现类PersonFatBuilder。 该类继承PersonBuilder, 并实现了抽象方法。

public class PersonFatBuilder extends PersonBuilder {
    public PersonFatBuilder(Graphics graphics) {
        super(graphics);
    }
    @Override
    public void buildHead() {
        graphics.drawOval(50, 20, 30, 30);
        graphics.drawArc(50, 30, 10, 5, 45, 135);
        graphics.drawArc(70, 30, 10, 5, 45, 135);
        graphics.drawArc(60, 35, 10, 5, 200, 135);
    }

    @Override
    public void buildBody() {
        graphics.drawRect(55, 50, 20, 50);
    }

    @Override
    public void buildArmLeft() {
        graphics.drawLine(55, 50, 40, 100);
    }

    @Override
    public void buildArmRight() {
        graphics.drawLine(75, 50, 90, 100);
    }

    @Override
    public void buildLegLeft() {
        graphics.drawLine(55, 100, 45, 150);
    }

    @Override
    public void buildLegRight() {
        graphics.drawLine(75, 100, 85, 150);
    }
}

3. 定义具体 Director

该类负责具体的建造过程, 对建成什么样不关心。

public class PersonDirector {
    private PersonBuilder personBuilder;

    public PersonDirector(PersonBuilder personBuilder) {
        this.personBuilder = personBuilder;
    }

    public void drawPerson() {
        personBuilder.buildHead();
        personBuilder.buildBody();
        personBuilder.buildArmLeft();
        personBuilder.buildArmRight();
        personBuilder.buildLegLeft();
        personBuilder.buildLegRight();
    }
}

4. 测试

建立一个窗口,将小人画出来。

 public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            // 创建窗口对象
            JFrame frame = new JFrame();
            frame.setVisible(true);
            frame.setTitle("画人");
            frame.setSize(250, 300);

            // 设置窗口关闭按钮的默认操作(点击关闭时退出进程)
            frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

            // 把窗口位置设置到屏幕的中心
            frame.setLocationRelativeTo(null);
            frame.setContentPane(new JPanel(){
                @Override
                protected void paintComponent(Graphics g) {
                    super.paintComponent(g);
                    PersonThinBuilder thinBuilder = new PersonThinBuilder(g);
                    PersonDirector director = new PersonDirector(thinBuilder);
                    director.drawPerson();


                }
            });
        }
    });
}

结果如下:

Java 디자인 패턴 - 빌더 패턴

定义

文字定义

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

换句话解释, 允许你创建不同种类的对象, 同时又能避免对构造函数的污染。当对象有多种类型时, 该模式非常有用。 或者在创建对象时涉及到很多的步骤。

结构图

引用《大话设计模式》的一个图

Java 디자인 패턴 - 빌더 패턴

抽象类Builder:为创建Product对象而抽象的接口。

继承类ConcreateBuilder:具体的建造者, 构造和装配各个部件。

具体产品类Product:我们需要建造的对象。

Director: 用来创建产品的, 其内部有Builder类型的成员变量。

优点

  1. Director 不需要知道 Product 的内部细节, 它只提供需要的信息给建设者, 由具体的建造者ConcreateBuilder处理从而完成产品的构造。

  2. 建造者模式将复杂的产品创建过程分散到了不同的对象中, 从而实现对产品创建过程更精确的控制, 创建过程更加清晰。

  3. 每个具体的建造者都可以创建出完整的产品对象, 而且是相互独立的。 因此, 调用端可以通过不同的具体建造者就可以得到不同的对象。当有新的产品出现时, 不需要改变原有代码, 只需要添加一个建造者即可。

举例

现在如果我们想建造一个胖小人,有五官的。那我们只需要添加一个PersonFatBuilder

원산

악당을 그려야 한다고 가정하면 다음과 같은 생성자 정의가 있을 수 있습니다.

public class PersonFatBuilder extends PersonBuilder {
    public PersonFatBuilder(Graphics graphics) {
        super(graphics);
    }
    @Override
    public void buildHead() {
        graphics.drawOval(50, 20, 30, 30);
        graphics.drawArc(50, 30, 10, 5, 45, 135);
        graphics.drawArc(70, 30, 10, 5, 45, 135);
        graphics.drawArc(60, 35, 10, 5, 200, 135);
    }

    @Override
    public void buildBody() {
        graphics.drawRect(55, 50, 20, 50);
    }

    @Override
    public void buildArmLeft() {
        graphics.drawLine(55, 50, 40, 100);
    }

    @Override
    public void buildArmRight() {
        graphics.drawLine(75, 50, 90, 100);
    }

    @Override
    public void buildLegLeft() {
        graphics.drawLine(55, 100, 45, 150);
    }

    @Override
    public void buildLegRight() {
        graphics.drawLine(75, 100, 85, 150);
    }
}

그런 생성자를 보면, 다시 돌아와서 보면 혼란스러울 것 같습니다. 너무 많은 매개변수로 인해 후속 유지 관리가 매우 번거로워집니다.

Java 디자인 패턴 - 빌더 패턴구성 패턴은 이러한 문제를 해결할 수 있습니다.

사용

목표는 작은 사람을 그리는 것입니다

1. 추상 Builder

정의먼저 추상 PersonBuilder를 정의합니다. 코드>. 이 클래스는 악당을 그리는 데 필요한 단계를 정의하므로 <code>PersonBuilder를 통해 생성된 각 개체는 기본적으로 동일하지만 성격이 다를 수 있습니다.

rrreee

2. 특정 Builder 클래스 정의

특정 구현 클래스 PersonFatBuilder를 정의하세요. 이 클래스는 PersonBuilder를 상속하고 추상 메서드를 구현합니다. rrreee

3. 특정 Director 클래스를 정의합니다.

이 클래스는 특정 구성 프로세스를 담당하며 무엇이 빌드되는지는 신경 쓰지 않습니다.

rrreee

4. 테스트

창을 만들고 악당을 그립니다. rrreee결과는 다음과 같습니다: 🎜🎜Java 디자인 패턴 - 빌더 패턴🎜

정의

텍스트 정의

🎜복잡한 객체의 구성과 표현을 분리하여 동일한 구성 프로세스가 다른 표현을 만들 수 있습니다. 🎜🎜즉, 생성자의 오염을 피하면서 다양한 유형의 객체를 생성할 수 있습니다. 이 패턴은 여러 유형의 객체가 있을 때 유용합니다. 또는 객체 생성에는 여러 단계가 포함됩니다. 🎜

구조 다이어그램

🎜"Dahua 디자인 패턴"🎜🎜Java 디자인 패턴 - 빌더 패턴🎜🎜Abstract 클래스 Builder: Product 개체를 생성하기 위한 추상 인터페이스입니다. 🎜🎜상속 클래스 ConcreateBuilder: 특정 빌더, 다양한 구성 요소를 구성 및 어셈블합니다. 🎜🎜특정 제품 카테고리 제품: 빌드해야 하는 객체입니다. 🎜🎜Director: 제품을 만드는 데 사용되며 내부에 Builder 유형의 멤버 변수가 있습니다. 🎜

장점

  1. 🎜이사제품의 내부 세부정보를 알 필요가 없습니다. , 특정 빌더인 ConcreateBuilder에서 처리하여 제품 구성을 완료하는 데 필요한 정보만 빌더에 제공합니다. 🎜
  2. 🎜빌더 모드는 복잡한 제품 제작 과정을 여러 객체로 분산시켜 제품 제작 과정을 더욱 정밀하게 제어하고 제작 과정을 더욱 명확하게 만듭니다. 🎜
  3. 🎜각 특정 빌더는 완전한 제품 개체를 만들 수 있으며 서로 독립적입니다. 따라서 호출자는 다양한 콘크리트 빌더를 통해 다양한 객체를 얻을 수 있습니다. 새로운 제품이 나올 때 원래 코드를 변경할 필요 없이 빌더만 추가하면 됩니다. 🎜

🎜이제 얼굴 특징을 지닌 뚱뚱하고 작은 남자를 만들고 싶다면. 그런 다음 PersonFatBuilder 클래스만 추가하면 되며 원본 코드를 변경할 필요가 없습니다. 🎜rrreee🎜결과:🎜🎜🎜🎜🎜관련 권장 사항:🎜🎜🎜🎜【oracle 튜토리얼】Oracle Warehouse Builder 11g Rel🎜🎜🎜🎜yii Query Builder(yii Query Builder) 공식 가이드 번역🎜🎜

위 내용은 Java 디자인 패턴 - 빌더 패턴의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.