Java 设计模式 — 建造者与 模板方法
2025/12/19大约 5 分钟
📋 本文节选自《Java 设计模式面试题》,返回 查看全部章节
8.建造者模式
1.什么是建造者模式
- 建造者模式:是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的方 式进行创建。
- 工厂类模式是提供的是创建单个类的产品
- 而建造者模式则是将各种产品集中起来进行管理,用来具有不同的属性的产品
建造者模式通常包括下面几个角色:
1、 uilder:给出一个抽象接口,以规范产品对象的各个组成成分的建造这个接口规定要实现复杂对; 象的哪些部分的创建,并不涉及具体的对象部件的创建。 2、 ConcreteBuilder:实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建; 在建造过程完成后,提供产品的实例。 3、 Director:调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负; 责保证对象各部分完整创建或按某种顺序创建。 4、 Product:要创建的复杂对象;
2.建造者模式的使用场景
使用场景:
1、 需要生成的对象具有复杂的内部结构; 2、 需要生成的对象内部属性本身相互依赖;
- 与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。
- JAVA 中的 StringBuilder就是建造者模式创建的,他把一个单个字符的char数组组合起来
- Spring不是建造者模式,它提供的操作应该是对于字符串本身的一些操作,而不是创建或改变一个 字符串。
3.代码案例
1、 建立一个装备对象Arms;
package com.lijie;
//装备类
public class Arms {
//头盔
private String helmet;
//铠甲
private String armor;
//武器
private String weapon;
//省略Git和Set方法...........
}1、 创建Builder接口(给出一个抽象接口,以规范产品对象的各个组成成分的建造,这个接口只是规范)
package com.lijie;
public interface PersonBuilder {
void builderHelmetMurder();
void builderArmorMurder();
void builderWeaponMurder();
void builderHelmetYanLong();
void builderArmorYanLong();
void builderWeaponYanLong();
Arms BuilderArms(); //组装
}1、 创建Builder实现类(这个类主要实现复杂对象创建的哪些部分需要什么属性);
package com.lijie;
public class ArmsBuilder implements PersonBuilder {
private Arms arms;
//创建一个Arms实例,用于调用set方法
public ArmsBuilder() {
arms = new Arms();
}
public void builderHelmetMurder() {
arms.setHelmet("夺命头盔");
}
public void builderArmorMurder() {
arms.setArmor("夺命铠甲");
}
public void builderWeaponMurder() {
arms.setWeapon("夺命宝刀");
}
public void builderHelmetYanLong() {
arms.setHelmet("炎龙头盔");
}
public void builderArmorYanLong() {
arms.setArmor("炎龙铠甲");
}
public void builderWeaponYanLong() {
arms.setWeapon("炎龙宝刀");
}
public Arms BuilderArms() {
return arms;
}
}1、 Director(调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负; 责保证对象各部分完整创建或按某种顺序创建)
package com.lijie;
public class PersonDirector {
//组装
public Arms constructPerson(PersonBuilder pb) {
pb.builderHelmetYanLong();
pb.builderArmorMurder();
pb.builderWeaponMurder();
return pb.BuilderArms();
}
//这里进行测试
public static void main(String[] args) {
PersonDirector pb = new PersonDirector();
Arms arms = pb.constructPerson(new ArmsBuilder());
System.out.println(arms.getHelmet());
System.out.println(arms.getArmor());
System.out.println(arms.getWeapon());
}
}9.模板方法模式
1.什么是模板方法
- 模板方法模式:定义一个操作中的算法骨架(父类),而将一些步骤延迟到子类中。 模板方法使 得子类可以不改变一个算法的结构来重定义该算法的
2.什么时候使用模板方法
- 实现一些操作时,整体步骤很固定,但是呢。就是其中一小部分需要改变,这时候可以使用模板方 法模式,将容易变的部分抽象出来,供子类实现。
3.实际开发中应用场景哪里用到了模板方法
- 其实很多框架中都有用到了模板方法模式
- 例如:数据库访问的封装、Junit单元测试、servlet中关于doGet/doPost方法的调用等等
4.现实生活中的模板方法
例如:
1、 去餐厅吃饭,餐厅给我们提供了一个模板就是:看菜单,点菜,吃饭,付款,走人(这里“点菜和付款” 是不确定的由子类来完成的,其他的则是一个模板。)
5.代码实现模板方法模式
1、 先定义一个模板把模板中的点菜和付款,让子类来实现;
package com.lijie;
//模板方法
public abstract class RestaurantTemplate {
// 1.看菜单
public void menu() {
System.out.println("看菜单");
}
// 2.点菜业务
abstract void spotMenu();
// 3.吃饭业务
public void havingDinner(){
System.out.println("吃饭"); }
// 3.付款业务
abstract void payment();
// 3.走人
public void GoR() {
System.out.println("走人"); }
//模板通用结构
public void process(){
menu();
spotMenu();
havingDinner();
payment();
GoR();
}
}1、 具体的模板方法子类1;
package com.lijie;
public class RestaurantGinsengImpl extends RestaurantTemplate {
void spotMenu() {
System.out.println("人参");
}
void payment() {
System.out.println("5快");
}
}1、 具体的模板方法子类2;
package com.lijie;
public class RestaurantLobsterImpl extends RestaurantTemplate {
void spotMenu() {
System.out.println("龙虾");
}
void payment() {
System.out.println("50块");
}
}1、 客户端测试;
package com.lijie;
public class Client {
public static void main(String[] args) {
//调用第一个模板实例
RestaurantTemplate restaurantTemplate = new RestaurantGinsengImpl();
restaurantTemplate.process();
}
}