【地铁上的设计模式】--创建型模式:建造者模式

2023-04-28 19:58:57 浏览数 (1)

什么是建造者模式

建造者模式(Builder Pattern)是一种创建型设计模式,它允许逐步创建复杂对象,同时分离出对象的构造过程和表示。该模式将构造复杂对象的过程分解为多个简单的步骤,使得相同的构造过程可以创建不同的表示形式。建造者模式通常适用于构造复杂对象或需要生成多个不同表示的对象。与其他创建型模式相比,建造者模式更加关注对象的构建过程,而不是创建过程。

如何实现建造者模式

建造者模式的实现步骤如下:

  1. 创建产品类:定义需要被构建的对象以及对象的属性和方法。
  2. 创建建造者抽象类:包含创建对象各个部件的抽象方法。
  3. 创建具体建造者类:实现建造者抽象类中定义的各个方法,具体负责构建产品的各个部件。
  4. 创建指挥者类:协调建造者类,指挥建造过程。
  5. 客户端调用:首先创建具体建造者类的实例,然后创建指挥者类的实例并将建造者实例传入指挥者类,最后通过指挥者实例调用建造者实例的方法完成产品的构建。

通过这些步骤,我们可以实现建造者模式,让对象的创建和表示分离,使得相同的构建过程可以创建不同的表示,提高了系统的灵活性和可扩展性。

JAVA实现

以下是Java实现建造者模式的代码,主要包括产品类、建造者接口、具体建造者类和指挥者类:

代码语言:javascript复制
// 产品类
public class Product {
    private String partA;
    private String partB;
    private String partC;

    public void setPartA(String partA) {
        this.partA = partA;
    }

    public void setPartB(String partB) {
        this.partB = partB;
    }

    public void setPartC(String partC) {
        this.partC = partC;
    }

    @Override
    public String toString() {
        return "Product{"  
                "partA='"   partA   '''  
                ", partB='"   partB   '''  
                ", partC='"   partC   '''  
                '}';
    }
}

// 建造者接口
public interface Builder {
    void buildPartA();
    void buildPartB();
    void buildPartC();
    Product getResult();
}

// 具体建造者类
public class ConcreteBuilder implements Builder {
    private Product product;

    public ConcreteBuilder() {
        product = new Product();
    }

    @Override
    public void buildPartA() {
        product.setPartA("PartA");
    }

    @Override
    public void buildPartB() {
        product.setPartB("PartB");
    }

    @Override
    public void buildPartC() {
        product.setPartC("PartC");
    }

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

// 指挥者类
public class Director {
    private Builder builder;

    public Director(Builder builder) {
        this.builder = builder;
    }

    public void construct() {
        builder.buildPartA();
        builder.buildPartB();
        builder.buildPartC();
    }
}

// 测试代码
public class Test {
    public static void main(String[] args) {
        Builder builder = new ConcreteBuilder();
        Director director = new Director(builder);
        director.construct();
        Product product = builder.getResult();
        System.out.println(product);
    }
}

C#实现

以下是使用C#实现建造者模式的示例代码:

代码语言:javascript复制
public class Product
{
    private string _partA;
    private string _partB;
    private string _partC;
    
    public void SetPartA(string partA)
    {
        _partA = partA;
    }
    
    public void SetPartB(string partB)
    {
        _partB = partB;
    }
    
    public void SetPartC(string partC)
    {
        _partC = partC;
    }
    
    public string GetProduct()
    {
        return _partA   ", "   _partB   ", "   _partC;
    }
}

public interface IBuilder
{
    void BuildPartA();
    void BuildPartB();
    void BuildPartC();
    Product GetProduct();
}

public class ConcreteBuilder : IBuilder
{
    private Product _product = new Product();
    
    public void BuildPartA()
    {
        _product.SetPartA("Part A");
    }
    
    public void BuildPartB()
    {
        _product.SetPartB("Part B");
    }
    
    public void BuildPartC()
    {
        _product.SetPartC("Part C");
    }
    
    public Product GetProduct()
    {
        return _product;
    }
}

public class Director
{
    public void Construct(IBuilder builder)
    {
        builder.BuildPartA();
        builder.BuildPartB();
        builder.BuildPartC();
    }
}

在这个示例中,我们定义了一个Product类,包含三个部分PartAPartBPartC。接着,我们定义了一个IBuilder接口和一个ConcreteBuilder类来实现该接口。Director类则用来指挥ConcreteBuilder类构建Product对象。在使用时,我们首先创建一个ConcreteBuilder对象,然后将其传递给Director类的Construct方法。这个方法会调用ConcreteBuilder对象的BuildPartABuildPartBBuildPartC方法来构建Product对象。最后,我们可以通过GetProduct方法获得构建好的Product对象。

总结

建造者模式是一种创建型设计模式,它通过将一个复杂对象的构造过程分解为多个简单的步骤,使得我们能够逐步构建该对象。该模式将对象的构建与其表示分离开来,使得同样的构建过程可以创建不同的表示形式。它可以减少代码重复,提高代码复用性和灵活性,并且使得代码更易于维护和测试。但是,由于要创建多个对象,并且要维护一个复杂的建造者类,因此其实现过程可能会比较复杂,并且可能会影响性能。此外,它还要求构造过程是稳定的,一旦构造过程发生变化,就需要修改建造者类的代码。

0 人点赞