java中建造者模式和模版模式的区别?可以用代码实例说明

建造者模式(Builder Pattern)和模板模式(Template Pattern)在Java中都是行为设计模式,但它们的用途和目的有所不同。以下是两者的主要区别,并通过代码实例来说明。

建造者模式(Builder Pattern)
建造者模式主要用于构建复杂对象的表示,并将构建过程与它的表示分离,使得同样的构建过程可以创建不同的表示。该模式允许你通过简单的方法来创建具有复杂内部结构的对象。

代码实例
java
// 产品接口  
public interface Car {  
    void setEngine(String engine);  
    void setWheels(int wheels);  
    void setBody(String body);  
    // ... 其他设置方法  
  
    void display();  
}  
  
// 具体的产品实现  
public class ConcreteCar implements Car {  
    private String engine;  
    private int wheels;  
    private String body;  
    // ... 其他属性  
  
    // 省略getter和setter  
  
    @Override  
    public void display() {  
        System.out.println("Car Details:");  
        System.out.println("Engine: " + engine);  
        System.out.println("Wheels: " + wheels);  
        System.out.println("Body: " + body);  
        // ... 输出其他属性  
    }  
}  
  
// 建造者接口  
public interface CarBuilder {  
    CarBuilder setEngine(String engine);  
    CarBuilder setWheels(int wheels);  
    CarBuilder setBody(String body);  
    // ... 其他设置方法  
  
    Car build();  
}  
  
// 具体的建造者实现  
public class ConcreteCarBuilder implements CarBuilder {  
    private ConcreteCar car = new ConcreteCar();  
  
    @Override  
    public CarBuilder setEngine(String engine) {  
        car.setEngine(engine);  
        return this; // 链式调用  
    }  
  
    // ... 其他实现  
  
    @Override  
    public Car build() {  
        return car;  
    }  
}  
  
// 使用示例  
public class Client {  
    public static void main(String[] args) {  
        CarBuilder builder = new ConcreteCarBuilder();  
        Car car = builder.setEngine("V8")  
                         .setWheels(4)  
                         .setBody("Sedan")  
                         .build();  
        car.display();  
    }  
}
模板模式(Template Pattern)
模板模式定义了一个操作中的算法的框架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。

代码实例
java
// 抽象类定义模板  
public abstract class AbstractClass {  
    public final void templateMethod() {  
        specificMethod1();  
        specificMethod2();  
        // ... 其他方法调用  
  
        hook(); // 钩子方法,可选实现  
    }  
  
    protected abstract void specificMethod1();  
    protected abstract void specificMethod2();  
  
    // 钩子方法,子类可以选择实现  
    protected void hook() {  
        // 默认实现为空  
    }  
}  
  
// 具体子类实现模板中的抽象方法  
public class ConcreteClass extends AbstractClass {  
    @Override  
    protected void specificMethod1() {  
        System.out.println("ConcreteClass implements specificMethod1");  
    }  
  
    @Override  
    protected void specificMethod2() {  
        System.out.println("ConcreteClass implements specificMethod2");  
    }  
  
    // 可以选择覆盖钩子方法  
    @Override  
    protected void hook() {  
        System.out.println("ConcreteClass overrides hook");  
    }  
}  
  
// 使用示例  
public class Client {  
    public static void main(String[] args) {  
        AbstractClass obj = new ConcreteClass();  
        obj.templateMethod(); // 调用模板方法,会按照定义的顺序调用各个方法  
    }  
}
通过上面的代码实例,我们可以看到两种模式的主要区别:

建造者模式关注的是复杂对象的构建过程,并提供了构建步骤的封装和复用;而模板模式关注的是算法框架的定义,允许子类在不改变算法结构的情况下重定义某些步骤。
建造者模式通常用于创建对象,而模板模式通常用于定义算法或操作过程。
建造者模式中的建造者接口和具体建造者类是可扩展的,可以根据需要添加新的构建步骤;而模板模式中的抽象类和具体子类通常更加稳定,不容易频繁变动。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值