初识设计模式(建造者模式)

前言:继续学习设计模式,今天学习建造者模式。

建造者模式(Builder Pattern)

定义

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

设计原则

  依赖倒转原则,抽象不应该依赖细节,细节应该依赖抽象。

目的

  如果我们用了建造者模式,那么用户就只需要指定需要建造的类型就可以得到他们,而具体建造的过程和细节就不需要知道了。

什么时候使用

  主要用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的(产品对象具有共性),但对象内部的构建通常面临着复杂的变化。

好处

  使得建造者代码与表示代码分离,达到解耦。

  由于建造者隐藏了该产品是如何组装的,所以若要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了,符合“开闭原则”。

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

缺点

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

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

结构图

基本代码

具体产品

package designpatterns.builder;

import java.util.ArrayList;
import java.util.List;

/**
 * 具体产品
 * @author yule
 * @date 2018/8/12 13:32
 */
public class Product {
    private List<String> parts = new ArrayList<>();

    /**
     * 添加产品部件
     * @param part
     */
    public void addPart(String part){
        parts.add(part);
    }

    /**
     * 列举所有产品部件
     */
    public void show(){
        System.out.println("产品创建:");
        for(String part : parts){
            System.out.println(part);
        }
    }
}

创建抽象建造者,假设一个产品需要partA,partB组成

package designpatterns.builder;

/**
 * 抽象建造者
 * @author yule
 * @date 2018/8/12 13:36
 */
public abstract class Builder {
    public abstract void builderPartA();
    public abstract void builderPartB();

    public abstract Product getProduct();
}

创建具体建造者1

package designpatterns.builder;

/**
 * 具体建造者1
 * @author yule
 * @date 2018/8/12 13:37
 */
public class ConcreteBuilder1 extends Builder{

    private Product product = new Product();

    @Override
    public void builderPartA() {
        product.addPart("部件A1");
    }

    @Override
    public void builderPartB() {
        product.addPart("部件B1");
    }

    @Override
    public Product getProduct() {
        return product;
    }
}

创建具体建造者2

package designpatterns.builder;

/**
 * 具体建造者2
 * @author yule
 * @date 2018/8/12 13:39
 */
public class ConcreteBuilder2 extends Builder{

    private Product product = new Product();

    @Override
    public void builderPartA() {
        product.addPart("部件A2");
    }

    @Override
    public void builderPartB() {
        product.addPart("部件B2");
    }

    @Override
    public Product getProduct() {
        return product;
    }
}

创建指挥者,用来指挥创建过程

package designpatterns.builder;

/**
 * 指挥者,用来指挥创建过程
 * @author yule
 * @date 2018/8/12 13:40
 */
public class Director {
    public void Construct(Builder builder){
        builder.builderPartA();
        builder.builderPartB();
    }
}

客户端代码,客户不需要知道具体的建造过程

    public static void main(String[] args){
        Director director = new Director();

        Builder builder1 = new ConcreteBuilder1();
        director.Construct(builder1);
        Product product1 = builder1.getProduct();
        product1.show();

        Builder builder2 = new ConcreteBuilder2();
        director.Construct(builder2);
        Product product2 = builder2.getProduct();
        product2.show();
    }
原文地址:https://www.cnblogs.com/yuxiaole/p/9462784.html