一文带你了解建造者模式及相关实例解析

1.简介

The builder pattern is a design pattern designed to provide a flexible solution to various object creation problems in object-oriented programming. The intent of the Builder design pattern is to separate the construction of a complex object from its representation.

(builder模式是一种设计模式,旨在为面向对象编程中的各种对象创建问题提供灵活的解决方案。Builder设计模式的目的是将复杂对象的构造与其表示分离开来。)

-- 引用自维基百科

? Builder设计模式的目的是将复杂对象的构造与其表示分离开来。通过这样做,相同的构造过程可以创建不同的表示

2.建造模式利弊

优点:

  • 允许您更改产品的内部表示。
  • 封装用于构造和表示的代码。
  • 控制施工过程的各个步骤。

缺点:

  • 需要为每个不同类型的产品创建一个单独的ConcreteBuilder。
  • 要求构造器类是可变的。
  • 不能保证类的数据成员被初始化。
  • 依赖性注入可能不太受支持。
3.相关实例

? 这里我们举个造房子的例子,构建一个房子需要相应的建造团队和总指挥,我们把相关构建的内容封装起来,在调用的时候就可以获得一个完整的房子对象。

import com.test.afirst.month_12.day1219.builder.person.Director;
import com.test.afirst.month_12.day1219.builder.person.Product;
import lombok.Data;

/**
 *
 */
@Data
class House {
    /**
     * 屋顶
     */
    private String roof;
    /**
     * 横梁
     */
    private String beam;
    /**
     * 地基
     */
    private String foundation;
}

abstract class Builder {

    protected House house = new House();

    abstract void buildRoof();

    abstract void buildBeam();

    abstract void buildFoundation();

    public House getHouse() {
        return house;
    }

}

class TeamBuilder extends Builder {

    public TeamBuilder() {
    }

    public TeamBuilder(House house) {
        this.house = house;
    }

    @Override
    void buildRoof() {
        System.out.println("构建屋顶");
        house.setRoof("漂亮的屋顶");
    }

    @Override
    void buildBeam() {
        System.out.println("构建横梁");
        house.setBeam("结实的横梁");
    }

    @Override
    void buildFoundation() {
        System.out.println("构建地基");
        house.setFoundation("稳固的地基");
    }
}

class Contractor {

    private Builder builder;

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

    public void buildHouse() {
        builder.buildFoundation();
        builder.buildBeam();
        builder.buildRoof();
    }
}

public class HouseBuilderDemo {

    public static void main(String[] args) {

        Builder builder = new TeamBuilder();
        Contractor contractor = new Contractor(builder);
        contractor.buildHouse();
        House house = builder.getHouse();
        System.out.println(house);
    }

}
输出结果:
构建地基
构建横梁
构建屋顶
House(roof=漂亮的屋顶, beam=结实的横梁, foundation=稳固的地基)

原文地址:https://www.cnblogs.com/charlypage/p/12077523.html

时间: 2024-10-11 21:02:30

一文带你了解建造者模式及相关实例解析的相关文章

一天一个设计模式——Builder建造者模式

一.模式说明 在现实世界中,当我们要构造一个大型工程时(建一个大楼),通常的做法是先建造工程的每个独立部分,然后再逐步构造完成(先打地基,再搭框架,最后逐层累造).在程序设计领域,构造一个复杂的类时(或一些具有类似结构的复杂类时),也可以采用类似的思想:如果要创建一个用于构造文档的类(或者是word,或者是html),虽然具体的文档有不同的结构,但是构造这些对象有相同的套路:创建标题,创建内容,创建条目,结束文档.Builder建造者模式就是用来构造复杂的类的. 二.模式类图 三.模式时序图 四

C#设计模式(5)-建造者模式

引言 上一篇介绍了设计模式中的抽象工厂模式-C#设计模式(3)-抽象工厂模式,本篇将介绍建造者模式: 点击这里查看全部设计模式系列文章导航 建造者模式简介 建造者模式是将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示. 在软件系统中,有时候会面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成:由于需求的变化,这个复杂的对象的各个部分可能面临着剧烈的变化,但是把他们组合在一起的算法很稳定.提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持

【设计模式】 模式PK:工厂模式VS建造者模式

1.概述 工厂方法模式注重的是整体对象的创建方法,而建造者模式注重的是部件构建的过程,旨在通过一步一步地精确构造创建出一个复杂的对象.我们举个简单例子来说明两者的差异,如要制造一个超人,如果使用工厂方法模式,直接产生出来的就是一个力大无穷.能够飞翔.内裤外穿的超人:而如果使用建造者模式,则需要组装手.头.脚.躯干等部分,然后再把内裤外穿,才能创造一个超人. 2.工厂方法建造超人 2.1 类图 首先我们按照工厂方法创造超人,我们来看类图.类图中我们按照年龄段把超人分为两种类型:成年超人(如克拉克.

创建型模式(六)建造者模式

介绍这个设计模式之前,我先说两个知识点.Is-a.Has-a. Is-a 指一个类是另一个类的一种,是属于关系. Has-a 指表示一个角色的一项责任. 一句话的概要 创建一个复杂的对象,让其由各部分子对象通过一定的步骤而组合而成.这就是建造者模式. 剧情 小明跟女神交往过程中,总是感觉进展缓慢.于是小明就决定用一个烛光晚餐的惊喜,来打动女神. 但是,小明就一个人,他白天要约女神出来.所以他准备雇佣一个人来进行烛光晚餐的准备. 剧情看着很简单,但是我们来分析一下,怎么构造这种场景. 首先,必要的

C++设计模式之建造者模式(三)

4.引入钩子方法的建造者模式 建造者模式除了逐步构建一个复杂产品对象外,还可以通过Director类来更加精细地控制产品的创建过程,例如增加一类称之为钩子方法(HookMethod)的特殊方法来控制是否对某个buildPartX()的调用,也就是判断产品中某个部件是否需要被建造.钩子方法的返回类型通常为boolean类型,方法名一般为isXXX(),钩子方法定义在抽象建造者类中.在抽象建造者类中提供钩子方法的默认实现,具体建造者类如果不需要建造某个部件,则该建造者类覆盖抽象建造者类的钩子方法.

2015-03-12---外观模式,建造者模式(附代码),观察者模式(附代码),boost库应用

今天白天主要看了boost库的应用,主要是经常使用的一些库,array,bind,function,regex,thread,unordered,ref,smartpointers库,晚上看了看设计模式.主要就是外观模式.建造者模式和观察者模式.我们从boost简要说起. 事实上boost的库好多东西在c++11里面已经有了.比方bind,仅仅只是boost的库的bind比c++11用着感觉要方便.事实上有些东西我自己由于也没实用c++做过什么大的项目.所以不敢乱说,仅仅敢说点建议性的,关于bi

2015-03-12---外观模式,建造者模式,观察者模式,boost库应用

今天白天主要看了boost库的应用,主要是常用的一些库,array,bind,function,regex,thread,unordered,ref,smartpointers库,晚上看了看设计模式,主要就是外观模式,建造者模式和观察者模式.我们从boost简要说起. 其实boost的库好多东西在c++11里面已经有了,比如bind,只不过boost的库的bind比c++11用着感觉要方便,其实有些东西我自己因为也没有用c++做过什么大的项目,所以不敢乱说,只敢说点建议性的,关于bind就是绑定

.NET设计模式 第二部分 创建型模式(3)—建造者模式(Builder Pattern)

建造者模式(Builder Pattern) ——.NET设计模式系列之四 Terrylee,2005年12月17日 概述 在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成:由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法确相对稳定.如何应对这种变化?如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求改变而改变?这就是要说的建造者模式. 本文通过现实生活中的买

建造者模式应用场景

比如在玩"极品飞车"这款游戏,那么每一关的地图会千变万化,简单的来说,地图会有晴天和阴天之分,那么创建地图时就要根据晴天或者阴天来对地图上的场景,比如:天空,树,房子,和路面进行渲染,这个过程是一个固定的,每创建一个新地图都要执行这几个渲染,这是针对高级配置的电脑来说的. 现在拥有低配置电脑的人不在少数,那么他们就不能玩游戏了吗?完全可以!只要将地图中占用资源比较高的渲染去掉就可以,比如带反射光影的树,这时候需要创建不同的地图,但地图的创建过程却是固定的,建造者模式完全可以应对这样的情