文章目录
- 1.模板方法模式
- 1.目录结构
- 2.AbstractClass.java 抽象类
- 3.Client.java
- 4.测试结果
- 5.总结
- 2.生成器模式
- 1.目录结构
- 2.Computer.java 生成器模式构建电脑
- 3.Client.java
- 4.测试结果
- 5.总结
1.模板方法模式
1.目录结构
2.AbstractClass.java 抽象类
package com.sunxiansheng.design_pattern.template;/*** Description: 抽象类** @Author sun* @Create 2025/1/27 13:49* @Version 1.0*/
public abstract class AbstractClass {/*** 模板方法*/public void templateMethod() {// 先调用抽象方法abstractMethod();// 然后根据钩子方法的返回值来决定是否要调用基本方法if (callingBasicMethods()) {baseMethod();}}/*** 基本方法(抽象类写好的方法)*/protected void baseMethod() {System.out.println("基本方法被调用!");}/*** 抽象方法(交给子类去实现,也只有子类才可以访问)*/protected abstract void abstractMethod();/*** 钩子方法(用来改变模板方法的行为,子类可以去重写)** @return 是否调用基本方法,默认为true*/protected boolean callingBasicMethods() {return true;}
}
3.Client.java
package com.sunxiansheng.design_pattern.template;/*** Description: 客户端** @Author sun* @Create 2025/1/27 14:07* @Version 1.0*/
public class Client {public static void main(String[] args) {// 创建一个具体类的对象(不重写钩子方法)AbstractClass abstractClassA = new AbstractClass() {@Overrideprotected void abstractMethod() {System.out.println("abstractClassA实现的抽象方法");}};abstractClassA.templateMethod();System.out.println("------------------------------");// 创建一个具体类的对象(重写钩子方法)AbstractClass abstractClassB = new AbstractClass() {@Overrideprotected void abstractMethod() {System.out.println("abstractClassB实现的抽象方法");}@Overrideprotected boolean callingBasicMethods() {return false;}};abstractClassB.templateMethod();}
}
4.测试结果
5.总结
模板方法模式最核心的就是一个抽象类,这个抽象类包含了四种类型的方法,第一种是模板方法,负责调用其他三种方法来完成具体的功能,第二种是普通方法,这个方法就是在抽象类中定义好的方法,可以直接被模板方法调用,第三种是抽象方法,这个方法需要由子类去实现。第四种是钩子方法,就是模板方法可以根据这个方法的返回值来决定具体的逻辑,一般父类中有默认实现,但是子类可以去重写,从而去改变模板方法的执行逻辑。
2.生成器模式
1.目录结构
2.Computer.java 生成器模式构建电脑
package com.sunxiansheng.design_pattern.builder;/*** Description: 生成器模式构建电脑** @Author sun* @Create 2025/1/31 15:21* @Version 1.0*/
public class Computer {// 必选参数private String cpu;private String ram;// 可选参数private int storage;private String graphicsCard;// 私有化构造函数,使用Builder进行创建private Computer(Builder builder) {this.cpu = builder.cpu;this.ram = builder.ram;this.storage = builder.storage;this.graphicsCard = builder.graphicsCard;}public static class Builder {// 必选参数private String cpu;private String ram;// 可选参数(有默认值)private int storage = 256;private String graphicsCard = "Integrated";// 构造函数,初始化必选参数public Builder(String cpu, String ram) {this.cpu = cpu;this.ram = ram;}// setter方法设置可选参数public Builder setStorage(int storage) {this.storage = storage;return this;}public Builder setGraphicsCard(String graphicsCard) {this.graphicsCard = graphicsCard;return this;}// 构建并返回一个Computer对象public Computer build() {return new Computer(this);}}@Overridepublic String toString() {return "Computer{" +"cpu='" + cpu + '\'' +", ram='" + ram + '\'' +", storage=" + storage +", graphicsCard='" + graphicsCard + '\'' +'}';}
}
3.Client.java
package com.sunxiansheng.design_pattern.builder;/*** Description: 客户端** @Author sun* @Create 2025/1/31 15:34* @Version 1.0*/
public class Client {public static void main(String[] args) {Computer computer = new Computer.Builder("Intel", "16GB").setStorage(512).setGraphicsCard("NVIDIA").build();System.out.println(computer);}
}
4.测试结果
5.总结
生成器模式就是用来构建一个对象的,首先要构建的对象一般是有必选参数和可选参数的,然后有一个静态内部类Builder,这个类的属性跟要构建的对象是完全一致的,通过构造器去设置必选参数,然后使用setter方法去设置可选参数,当然也可以通过返回this来实现链式调用,最后再调用一个build方法使用builder对象的属性值来构建一个想要构建的对象。