设计模式之建造者模式

本文通过一个客厅装修的例子介绍了建造者模式的应用。建造者模式将复杂对象的构建与表示分离,允许创建不同表示的步骤。在案例中,客厅作为产品角色,包含了墙体、沙发和电视等部分;抽象建造者定义了构建这些部分的接口,具体建造者(工人)实现了这些接口,负责实际的装修工作;指挥者(项目经理)协调建造者的操作,完成客厅的装修。这种模式提高了封装性和扩展性,但当产品内部变化复杂时,维护成本会增加。
摘要由CSDN通过智能技术生成

概念:将一个复杂对象的构建与它的表示分离,使同样的构建过程创建不同的表示,这样的设计模式就被称为是建造者模式。其实说简单点就是将一个复杂对象分解为多个简单对象,然后一步一步的构建出来。
优点:
1、封装性好,因为表示与构建分离
2、扩展性好,因为将一个复杂的对象拆分成多个简单对象,多个对象相互独立,有利于系统节藕
3、客户端不必知道产品内部的组成细节,建造者可以对创建过程逐步细化,而不对其他模块产生任何影响,便于控制细节风险
缺点:
1、产品的组成部分必须相同,这就限制了它的使用范围
2、如果产品内部的变化复杂,如果产品内部发生了变化,则建造者也要同步的进行修改,后期维护成本比较大

建造者模式分为四个角色:

产品、抽象建造者、具体建造者、指挥者

  1. 产品角色:它是包含多个组成部件的复杂角色,由具体的建造者创建
  2. 抽象建造者:它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含返回一个复杂对象的getResult()方法
  3. 具体建造者:实现Builder方法,完成复杂部件的各个子部件的具体的创建方法
  4. 指挥者:它调用构建者对象中的部件构造与装配方法完成复杂对象的构建,在指挥者中不涉及具体产品的信息

UML类图:
在这里插入图片描述

话不多说,上代码:

有很多人喜欢从抽象建造者开始写,我个人认为建造者模式其实应该从产品开始划分,因为你只有知道你这个产品是什么,你才能够摆脱之前的固有化思维,当然这也是小弟的个人见解,如有不对的地方还希望大哥们海涵 _

项目背景:客厅装修,一般来说,客厅都包含什么?墙体的装修,沙发的选择,电视机的选择等,建造者模式难得地方就在于如何将一个产品的角色给划分出来,以客厅装修来划分角色那么就是,客厅为产品,它包含了墙体的装修、沙发、电视等组成部分,而装修工人是具体的建造者,他们包含了墙体的装修、沙发以及电视的安装摆放,项目经理为指挥者,他指挥工人们进行装修

//产品:客厅

public class Parlour{
private String wall; //墙
private String tv; //电视
private String sofa; //沙发

//此处省略getter、setter

}

//抽象建造者:工人
public abstract class Decorator{
//创建产品对象
protected Parlour parlour = new Parlour();
//提供抽象方法
public abstract void buildWall();
public abstract void buildTV();
public abstract void buildSofa();

//返回产品对象
public Parlour getResult(){
return pralour;
}
}

//具体的建造者:工人1
public class ConcreteDecorator1 extends Decorator{
public void buildWall(){
system.out.println(“wall1”);
}
public void buildTV(){
system.out.println(“TV1”);
}
public void buildSofa(){
system.out.println(“Sofo1”);
}
}

//具体的建造者:工人2
public class ConcreteDecorator2 extends Decorator{
public void buildWall(){
system.out.println(“wall2”);
}
public void buildTV(){
system.out.println(“TV2”);
}
public void buildSofa(){
system.out.println(“Sofo2”);
}
}

//指挥者:项目经理
public class ProjectManager{
private Decorator builder;

public ProjectManager(Decorator builder){
this.builder = builder;
}

//产品构建与组装方法
public Parlour decorate(){
builder.buildWall();
builder.buildTV();
builder.buildSofo();
builder.getResult();
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值