0
点赞
收藏
分享

微信扫一扫

十:建造者模式:组装的智慧

a. 理解建造者模式

建造者模式是一种创建型设计模式,它可以让我们在不暴露对象创建细节的情况下,逐步构建一个复杂的对象。该模式将对象的构建和表示分离,使得同样的构建过程可以创建出不同的表示。这就像乐高积木,通过不同的组装方式,可以创建出各种各样的作品。

b. 动手实践:建造者模式示例

让我们以一个餐厅订单为例,假设我们要实现一个餐厅的点餐系统。客户可以点汉堡、饮料等不同的食物组合。在这个场景中,我们可以使用建造者模式来完成订单的创建。 首先,我们需要一个抽象的建造者接口:

public interface OrderBuilder {
    OrderBuilder addBurger(String burger);
    OrderBuilder addDrink(String drink);
    OrderBuilder addDessert(String dessert);
    Order build();
}

然后,我们创建一个具体的建造者类实现这个接口:

public class RestaurantOrderBuilder implements OrderBuilder {
    private Order order;

    public RestaurantOrderBuilder() {
        order = new Order();
    }

    @Override
    public OrderBuilder addBurger(String burger) {
        order.setBurger(burger);
        return this;
    }

    @Override
    public OrderBuilder addDrink(String drink) {
        order.setDrink(drink);
        return this;
    }

    @Override
    public OrderBuilder addDessert(String dessert) {
        order.setDessert(dessert);
        return this;
    }

    @Override
    public Order build() {
        return order;
    }
}

接下来,我们创建一个表示订单的类:

public class Order {
    private String burger;
    private String drink;
    private String dessert;

    public void setBurger(String burger) {
        this.burger = burger;
    }

    public void setDrink(String drink) {
        this.drink = drink;
    }

    public void setDessert(String dessert) {
        this.dessert = dessert;
    }

    @Override
    public String toString() {
        return "Order{" +
                "burger='" + burger + '\'' +
                ", drink='" + drink + '\'' +
                ", dessert='" + dessert + '\'' +
                '}';
    }
}

最后,我们在客户端使用建造者模式创建订单:

public class Client {
    public static void main(String[] args) {
        OrderBuilder builder = new RestaurantOrderBuilder();
        Order order = builder.addBurger("Cheeseburger")
                .addDrink("Coca-Cola")
                .addDessert("Ice cream")
                .build();
        System.out.println(order);
    }
}

c. 优缺点剖析:建造者模式的影响

优点:

1、分离了对象的构建和表示,可以独立地改变构建过程和表示,使得代码更易维护。 2、更好的封装性,客户端无需知道对象的创建细节。只需通过建造者提供的接口来构建对象,这降低了系统的耦合度。 3、 建造者模式允许对对象的创建过程进行更细粒度的控制。这对于创建具有多个部分的复杂对象非常有用。

缺点:

1、如果对象的创建过程简单,使用建造者模式可能会导致代码冗余和过于复杂。 2、增加了系统的复杂性,需要额外定义建造者接口和具体建造者类。

d. 建造者模式在开源框架中的应用

在Java的开源框架中,建造者模式同样发挥着重要作用。以Apache HttpClient为例,它是一个广泛使用的HTTP客户端库。在创建HTTP请求时,它使用了建造者模式来构建HttpRequest对象。以下是一个简单的示例:

import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URIBuilder;

import java.net.URI;
import java.net.URISyntaxException;

public class HttpClientExample {
    public static void main(String[] args) throws URISyntaxException {
        URI uri = new URIBuilder()
                .setScheme("https")
                .setHost("www.example.com")
                .setPath("/api/v1/users")
                .setParameter("page", "1")
                .setParameter("size", "10")
                .build();

        HttpGet httpGet = new HttpGet(uri);
        System.out.println(httpGet);
    }
}

在这个例子中,我们使用了URIBuilder类创建一个URI对象。URIBuilder是一个典型的建造者类,它通过提供一系列setter方法来设置URI的不同部分,最后调用build()方法来创建URI对象。这使得创建具有多个参数的URI变得更加灵活和易于管理。 总之,建造者模式在处理复杂对象的创建过程时具有很大的优势。通过分离对象的构建和表示,我们可以更灵活地修改和扩展代码。同时,建造者模式在开源框架中的应用也进一步证明了它在实际项目中的实用性。然而,我们应该在适当的场景下使用建造者模式,避免过度设计和不必要的复杂性。

举报

相关推荐

0 条评论