初步理解设计模式——建造者模式

241 阅读2分钟

概念与介绍

定义

建造者模式是指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示。

建造者模式属于创建型模式,它使用多个简单的对象一步一步构建成一个复杂的对象,在这一过程中,产品的组成部分是不变的,但每一部分是可以灵活选择的。

应用场景

在开发的过程中,有时我们需要创建一些较为复杂的对象,这个复杂对象由很多部分组成,各个部分因为需求的变更经常产生变动,但是它们的组合过程却相对固定。

应用举例

比如早晨起床的服装搭配:衣服和裤子我们都是要穿的,但是具体穿什么衣服、什么裤子却是可以灵活选择的。

主要优点

1.封装性好,构建和表示分离

2.建造者独立、易扩展

2.建造者可以对创建过程逐步细化,而不对其它模块产生影响,便于控制细节风险

主要缺点

1.产品必须有共同点,限制了其使用范围

2.产品内部发生变化,则建造者也要同步修改。如果产品内部复杂,后期维护成本较大。

结构与实现

模式的结构

建造者模式1.png

模式的实现

import java.util.ArrayList;

//产品:包含多个组成部件的复杂对象
public class Product {

    ArrayList<String> parts = new ArrayList<>();

    public void addPart(String part) {
        parts.add(part);
    }

    public void show() {
        System.out.println(parts.toString());
    }
}
//抽象建造者:包含创建产品各个子部件的抽象方法
abstract class Builder {
    protected Product product = new Product();

    public abstract void buildPartA();
    public abstract void buildPartB();

    //返回产品对象
    public Product getResult(){
        return product;
    }
}
//具体建造者1:实现了抽象建造者接口
public class ConcreteBuilder1 extends Builder {

    public void buildPartA() {
        product.addPart("黑色夹克");
    }

    public void buildPartB() {
        product.addPart("黑色牛仔裤");
    }

}
//具体建造者2:实现了抽象建造者接口
public class ConcreteBuilder2 extends Builder {

    public void buildPartA() {
        product.addPart("紫色羽绒服");
    }

    public void buildPartB() {
        product.addPart("粉色超短裤");
    }

}
//指挥者:调用建造者中的方法完成复杂对象的创建
class Director {

    //产品构建与组装方法
    public Product construct(Builder builder) {
        builder.buildPartA();
        builder.buildPartB();
        return builder.getResult();
    }
}
//客户端
public class Client {

    public static void main(String[] args) {
        Director director = new Director();
        Builder builder1 = new ConcreteBuilder1();
        Builder builder2 = new ConcreteBuilder2();

        //构建产品1
        Product product1 = director.construct(builder1);
        product1.show();

        //构建产品2
        Product product2 = director.construct(builder2);
        product2.show();

    }
}

程序运行结果

[黑色夹克, 黑色牛仔裤]
[紫色羽绒服, 粉色超短裤]