0
点赞
收藏
分享

微信扫一扫

ChatGpt大模型入门

jjt二向箔 2024-02-28 阅读 21

建造者模式(Builder Pattern)的核心在于将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。这个模式被用来解决当一个对象需要多个部分来一步步构建时,而且每个部分的构建复杂度不一,或者对象的构建需要遵循特定的顺序时的问题。通过建造者模式,可以让客户端不需要知道内部构建的细节。

建造者模式通常包含以下几个核心组成部分:

  1. 产品(Product):最终要构建的复杂对象。
  2. 建造者(Builder):接口声明了创建产品对象各个部分的方法。
  3. 具体建造者(Concrete Builder):实现Builder接口,提供构建过程的具体实现,并负责提供产品的最终实例。
  4. 指挥者(Director):负责安排已有模块的构建顺序,然后向Builder对象指挥构建过程,但它不涉及具体产品的信息。
  5. 客户端(Client):使用指挥者和建造者来创建一个对象。

使用建造者模式的优点包括:

  • 封装性好:用户可以不知道产品内部组成的细节,将产品本身与产品的创建过程解耦。
  • 建造者独立,易扩展:具体的建造者类之间独立,对系统的扩展有利。
  • 便于控制细节风险:由于具体的建造者是独立的,因此可以控制产品的构建过程,以减少构建错误的风险。

建造者模式的核心在于分步骤构建一个复杂对象,并允许用户只通过指定复杂对象的类型和内容就可以构建它们,隐藏了对象的创建细节和过程。

在Java中使用建造者设计模式来实现建房子的过程,可以分为几个步骤:定义房子(Product),定义建造房子的步骤(Builder接口),提供具体的建造者(ConcreteBuilder),指挥者(Director)来控制建造过程,以及最后由客户端(Client)来创建对象。

下面是一个简化的示例,展示如何实现这个模式:

1. 首先定义房子

/**
 * @author 曹见朋
 * @create 2024-02-25-9:39
 */
@Data
public class House {

    private String basic;
    private String walk;
    private String roof;

}

2. 其次定义抽象建造者

/**
 * @author 曹见朋
 * @create 2024-02-25-9:39
 */
public interface Build {

    void buildBasic();
    void buildWalk();
    void buildRoof();
    House getHouse();
}

3. 然后定义具体建造者

/**
 * @author 曹见朋
 * @create 2024-02-25-9:48
 */
public class BuildLittleHouse implements Build{

    private House house;

    public BuildLittleHouse() {
        this.house = new House();
    }

    @Override
    public void buildBasic() {

        System.out.println("建造小屋的地基...");
        house.setBasic("小屋地基");
    }

    @Override
    public void buildWalk() {
        System.out.println("建造小屋的墙体...");
        house.setWalk("小屋的墙体");
    }

    @Override
    public void buildRoof() {
        System.out.println("建造小屋的屋顶...");
        house.setRoof("小屋的屋顶");
    }

    @Override
    public House getHouse() {
        return this.house;
    }
}
/**
 * @author 曹见朋
 * @create 2024-02-25-10:04
 */
public class BuildBigHouse implements Build{

    private House house;

    public BuildBigHouse() {
        this.house=new House();
    }

    @Override
    public void buildBasic() {
        System.out.println("建造大房子的地基");
        house.setBasic("大房子的地基");

    }

    @Override
    public void buildWalk() {
        System.out.println("建造大房子的墙体");
        house.setBasic("大房子的墙体");
    }

    @Override
    public void buildRoof() {
        System.out.println("建造大房子的屋顶");
        house.setBasic("大房子的屋顶");
    }

    @Override
    public House getHouse() {
        return this.house;
    }
}

4. 定义指挥者

/**
 * @author 曹见朋
 * @create 2024-02-25-9:53
 */
public class Director {

    private Build build;

    public Director() {
    }

    public Director(Build build) {
        this.build = build;
    }

    public House constructHouse(){
        build.buildBasic();
        build.buildWalk();
        build.buildRoof();
        return build.getHouse();
    }
}

5. 定义客户端

/**
 * @author 曹见朋
 * @create 2024-02-25-9:55
 */
public class Client {

    public static void main(String[] args) {
        Build build = new BuildLittleHouse();
        Director director = new Director(build);
        House house = director.constructHouse();
        System.out.println(house);

        System.out.println("===================");

        BuildBigHouse buildBigHouse = new BuildBigHouse();
        Director director1 = new Director(buildBigHouse);
        House house1 = director.constructHouse();
        System.out.println(house1);
    }

}

6. 运行

建造小屋的地基...
建造小屋的墙体...
建造小屋的屋顶...
House(basic=小屋地基, walk=小屋的墙体, roof=小屋的屋顶)
===================
建造小屋的地基...
建造小屋的墙体...
建造小屋的屋顶...
House(basic=小屋地基, walk=小屋的墙体, roof=小屋的屋顶)

Process finished with exit code 0
举报

相关推荐

0 条评论