设计模式使用场景实现示例及优缺点(创建型模式——建造者模式)
在一个遥远的国度,有一个名叫“构建城”的地方。在这个城里,住着一位著名的建筑师,他的名字叫阿尔法。阿尔法以其独特的建筑风格和高超的技艺而闻名于世,但他最为人称道的,是他发明了一种神奇的“建造者模式”。
阿尔法的建造者模式就像一把钥匙,可以打开创造复杂建筑的无限可能。他相信,建筑不应只是简单的堆砌砖瓦,而是要通过细致入微的步骤,逐渐形成美丽的作品。于是,他决定用这种模式来建造一座宏伟的城堡。
首先,阿尔法为城堡设计了一个蓝图,蓝图上详细列出了城堡的各个部分:高耸的塔楼、宽敞的大厅、精致的花园和坚固的围墙。他把每个部分都当作一个独立的“建筑组件”,这样可以让每个部分在构建时都有自己的特点和风格。
接下来,阿尔法开始分步骤进行建造。首先,他找来了工匠们,告诉他们:“我们先来建造城堡的基础。”工匠们按照阿尔法的指示,打下了坚实的基础。然后,他们继续建造围墙,确保城堡的安全。每完成一个部分,阿尔法都会仔细检查,并根据需要进行调整。
随着时间的推移,城堡的各个部分逐渐成型。高耸的塔楼在阳光下闪烁着金光,宽敞的大厅里悬挂着华丽的吊灯,精致的花园中开满了五彩斑斓的花朵。这一切都在阿尔法的精心构思下,变得生动而美丽。
最终,经过数月的努力,城堡终于完工了。阿尔法站在城堡的最高处,俯瞰着自己亲手建造的宏伟建筑,心中充满了自豪。他知道,这不仅仅是一座城堡,更是一种理念:通过分步骤的方式,细致地构建每一个部分,才能创造出真正的艺术品。
建造者模式(Builder Pattern)
建造者模式(Builder Pattern)是一种创建型设计模式,它允许你分步骤创建复杂对象。通过将一个复杂对象的构造代码从其表示中分离出来,建造者模式可以让你通过细化各个部分的构造步骤来创建一个复杂对象。
适用场景
-
需要生成的对象有复杂的内部结构:
- 对象的创建过程包含多个步骤或多个部件的创建。
-
同样的创建过程需要生成不同的表示:
- 一个构建过程可以创建多个不同类型的对象。
-
客户端代码不希望直接控制对象的创建过程:
- 客户端代码只需要一个构建器来控制创建的细节。
实现示例(Java)
以下是一个简单的建造者模式的实现示例,展示如何创建不同类型的房子(如石头房子和木头房子)。
1. 产品类
public class House {
private String foundation;
private String structure;
private String roof;
private String interior;
public void setFoundation(String foundation) {
this.foundation = foundation;
}
public void setStructure(String structure) {
this.structure = structure;
}
public void setRoof(String roof) {
this.roof = roof;
}
public void setInterior(String interior) {
this.interior = interior;
}
@Override
public String toString() {
return "House [foundation=" + foundation + ", structure=" + structure + ", roof=" + roof + ", interior=" + interior + "]";
}
}
2. 抽象建造者类
public abstract class HouseBuilder {
protected House house;
public House getHouse() {
return house;
}
public void createNewHouse() {
house = new House();
}
public abstract void buildFoundation();
public abstract void buildStructure();
public abstract void buildRoof();
public abstract void buildInterior();
}
3. 具体建造者类
public class StoneHouseBuilder extends HouseBuilder {
@Override
public void buildFoundation() {
house.setFoundation("Stone foundation");
}
@Override
public void buildStructure() {
house.setStructure("Stone walls");
}
@Override
public void buildRoof() {
house.setRoof("Stone roof");
}
@Override
public void buildInterior() {
house.setInterior("Stone interior");
}
}
public class WoodenHouseBuilder extends HouseBuilder {
@Override
public void buildFoundation() {
house.setFoundation("Wooden foundation");
}
@Override
public void buildStructure() {
house.setStructure("Wooden walls");
}
@Override
public void buildRoof() {
house.setRoof("Wooden roof");
}
@Override
public void buildInterior() {
house.setInterior("Wooden interior");
}
}
4. 指挥者类
public class Director {
private HouseBuilder houseBuilder;
public void setHouseBuilder(HouseBuilder houseBuilder) {
this.houseBuilder = houseBuilder;
}
public House getHouse() {
return houseBuilder.getHouse();
}
public void constructHouse() {
houseBuilder.createNewHouse();
houseBuilder.buildFoundation();
houseBuilder.buildStructure();
houseBuilder.buildRoof();
houseBuilder.buildInterior();
}
}
5. 客户端代码
public class Client {
public static void main(String[] args) {
Director director = new Director();
// 建造石头房子
HouseBuilder stoneHouseBuilder = new StoneHouseBuilder();
director.setHouseBuilder(stoneHouseBuilder);
director.constructHouse();
House stoneHouse = director.getHouse();
System.out.println("House built:\n" + stoneHouse);
// 建造木头房子
HouseBuilder woodenHouseBuilder = new WoodenHouseBuilder();
director.setHouseBuilder(woodenHouseBuilder);
director.constructHouse();
House woodenHouse = director.getHouse();
System.out.println("House built:\n" + woodenHouse);
}
}
注释说明
-
产品类:
House
类表示一个复杂对象。它有多个部件(如基础、结构、屋顶和内部装饰)。
-
抽象建造者类:
HouseBuilder
是一个抽象类,定义了构建House
对象的各个步骤(如buildFoundation
、buildStructure
等)。
-
具体建造者类:
StoneHouseBuilder
和WoodenHouseBuilder
是具体的建造者类,实现了抽象建造者类的方法,具体定义了如何构建House
的各个部件。
-
指挥者类:
Director
类负责管理建造过程。它通过调用HouseBuilder
的方法来一步步构建House
对象。
-
客户端代码:
Client
类通过Director
类来构建不同类型的房子。客户端代码不需要直接控制对象的创建过程,只需要使用Director
来管理建造者。
总结
建造者模式通过将复杂对象的构建过程分离出来,使得客户端代码可以灵活地构建不同类型的对象。它适用于需要构建复杂对象的场景,尤其是当对象的创建过程包含多个步骤或多个部件时。建造者模式可以提高代码的可读性和可维护性。
原文地址:https://blog.csdn.net/weixin_45049746/article/details/140571045
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!