解锁设计模式新姿势:建造者模式超详细解读

目录

一、开篇引入

二、建造者模式是什么

(一)概念解析

(二)模式角色

三、建造者模式的应用场景

(一)复杂对象创建

(二)对象创建过程控制

(三)不同表示的对象创建

四、建造者模式的实现

(一)代码示例

(二)代码解析

五、建造者模式的优缺点

(一)优点

(二)缺点

六、总结与思考


        

一、开篇引入

        想象一下,你打算建造一所梦想中的房子。这可不是一件简单的事,要考虑各种细节,像打地基、砌墙、安装门窗、室内装修等等。要是所有的步骤和决策都混在一起,肯定会乱成一锅粥。但要是有一个专业的建筑团队,他们分工明确,有人专门负责打地基,有人专注于砌墙,还有人擅长室内装修,并且有一个经验丰富的监工来协调各个环节,那整个建造过程是不是就清晰、高效多了?这其实就体现了建造者模式的核心思想。在软件开发中,当我们面对创建复杂对象的问题时,建造者模式就像这个专业的建筑团队,能帮我们把复杂的创建过程分解成一个个简单的步骤,让代码更清晰、更易维护 。接下来,就让我们深入探索建造者模式的奇妙世界吧!

二、建造者模式是什么

(一)概念解析

        建造者模式(Builder Pattern)是一种创建型设计模式 ,它将一个复杂对象的构建与它的表示分离,使得同样的构造过程可以创建不同的表示。这句话有点抽象,我们来仔细拆解一下。所谓 “复杂对象的构建”,就像前面提到的建造房子,房子是一个复杂对象,打地基、砌墙、装修等就是构建过程。“与它的表示分离”,意思是构建过程和最终呈现出来的房子样子是分开处理的。同样的构建流程,比如同样的打地基、砌墙步骤,最后可以建成别墅,也可以建成普通公寓,这就是 “同样的构造过程可以创建不同的表示” 。通过这种方式,建造者模式把复杂对象的创建过程封装起来,让代码更有条理,也更易于维护和扩展。

(二)模式角色

        在建造者模式中,主要涉及四个角色:产品(Product)、抽象建造者(Builder)、具体建造者(ConcreteBuilder)和指挥者(Director)。

  • 产品(Product):它是我们最终要创建的复杂对象,由多个部件组成。就拿汽车来说,汽车就是产品,它由引擎、轮胎、车身、座椅等多个部件构成 。这些部件相互协作,共同构成了完整的汽车产品。在代码中,产品通常是一个包含多个属性和方法的类,这些属性对应着产品的各个部件,方法则用于操作或展示这些部件的功能。

  • 抽象建造者(Builder):它定义了创建产品对象各个部件的抽象接口。还是以汽车为例,抽象建造者就像是一个汽车建造的蓝图,它规定了建造汽车需要的步骤,比如创建引擎、安装轮胎、打造车身等,但并不涉及具体的实现细节。在 Java 代码中,抽象建造者一般会被定义为一个接口或者抽象类,里面包含一系列抽象方法,每个方法对应创建产品的一个部件 。

  • 具体建造者(ConcreteBuilder):具体建造者是抽象建造者的实现类,它实现了抽象建造者中定义的所有抽象方法,负责具体构建产品的各个部件,并将这些部件组装成最终的产品。例如,有专门建造豪华汽车的具体建造者,它在实现抽象建造者的方法时,会使用高端的材料和工艺来创建引擎、座椅等部件,打造出豪华的汽车;还有建造经济型汽车的具体建造者,它会采用更经济实惠的方式来构建各个部件。每个具体建造者都有自己独特的构建方式,以满足不同类型产品的需求 。

  • 指挥者(Director):指挥者负责安排具体建造者构建产品的步骤,它知道如何使用具体建造者来创建最终的产品。可以把指挥者想象成汽车工厂的生产调度员,他不直接参与汽车部件的建造,但他指挥着各个具体建造者按照一定的顺序进行工作。比如,先让具体建造者创建引擎,再安装轮胎,最后进行车身组装等。指挥者的存在使得构建过程更加有序,也将客户端和具体建造者的实现细节隔离开来,客户端只需要和指挥者交互,就能创建出复杂的产品 。

三、建造者模式的应用场景

(一)复杂对象创建

        在软件开发中,创建复杂对象的场景十分常见 。以游戏开发为例,创建一个游戏角色就是一个典型的复杂对象创建过程。一个游戏角色可能拥有多种属性,如名字、等级、职业、技能、装备、生命值、魔法值等 。如果不使用建造者模式,在创建角色时,可能需要在一个构造函数中传入大量的参数来设置这些属性,这不仅使代码看起来混乱不堪,而且极难维护和扩展。例如,在创建一个战士角色时,如果直接通过构造函数来创建:

// 不使用建造者模式创建战士角色

public class Warrior {

private String name;

private int level;

private String profession;

private String[] skills;

private String[] equipments;

private int health;

private int magic;

public Warrior(String name, int level, String profession, String[] skills, String[] equipments, int health, int magic) {

this.name = name;

this.level = level;

this.profession = profession;

this.skills = skills;

this.equipments = equipments;

this.health = health;

this.magic = magic;

}

}

使用时:

String[] warriorSkills = {"挥砍", "冲锋"};

String[] warriorEquipments = {"大剑", "铠甲"};

Warrior warrior = new Warrior("勇敢的战士", 10, "战士", warriorSkills, warriorEquipments, 100, 0);

        可以看到,构造函数的参数列表很长,可读性很差。而且,如果要创建不同类型的角色,如法师、刺客等,每个角色都有不同的初始属性和技能装备,那么需要编写大量类似的构造函数,代码冗余严重 。

        而使用建造者模式,我们可以将角色的创建过程分解为多个步骤,每个步骤由具体的建造者负责 。比如,创建一个战士建造者类:

// 抽象建造者

abstract class CharacterBuilder {

protected GameCharacter character = new GameCharacter();

public abstract void buildName();

public abstract void buildLevel();

public abstract void buildProfession();

public abstract void buildSkills();

public abstract void buildEquipments();

public abstract void buildHealth();

public abstract void buildMagic();

public GameCharacter getCharacter() {

return character;

}

}

// 具体建造者:战士建造者

class WarriorBuilder extends CharacterBuild

你可能感兴趣的:(解锁设计模式新姿势:建造者模式超详细解读)