设计模式之区别-建造设计模式&&模板设计模式

建造模式和模板方法模式之间有什么区别。为什么拿他们进行比较呢?因为他们都是复用算法逻辑,将具体的构造放到子类中实现。

1. 建造模式

建造模式的核心在于分离构建算法具体构建的实现,从而使得构建算法可重用,具体的构造实现可以方便扩展和切换,从而可以灵活地构造出不同的产品对象。

建造模式是一个对象的创建型模式。

建造模式的结构

角色信息:

  • 抽象建造者角色(Builder:【所有产品的模板】抽象接口,规范产品对象的属性成员。一般来说,产品对象属性和建造方法(可以是抽象方法也可以是具体方法)数目相符,独立于应用程序的业务逻辑。

  • 具体建造者角色(ConcreteBuilder:【具体产品的模板】(1)实现抽象建造者Builder声明的接口;(2)在建造完成后,提供产品实例;

  • 导演者角色(Director:【所有产品的组装】调用具体建造者角色以创建产品对象。

  • 产品角色(Product:【具体产品】具体建造者返回的产品实例。

需要注意的是,在具体建造者角色中,已经完成了各个属性对象的初始化。而调用导演者角色,只是对各个属性对象的组装。

正常版本的建造模式:

//具体建造者角色
public class WelcomeBuilder extends Builder  {
    //获取对象
    public WelcomeBuilder() {
        message=new WelcomeMessage();
    }
    //组装零件(该方法是给导演者角色调用)
    @Override
    public void buildSubject() {
        message.setSubject("欢迎标题");
    }
    //组装零件(该方法是给导演者角色调用)
    @Override
    public void buildBody() {
        message.setBody("欢迎内容");
    }

    //输出产品对象(此对象没有进行组装)
    @Override
    public AutoMessage getAutoMessage() {
        return message;
    }
}

导演者角色:

//导演者角色
public class Director {

    Builder builder;

    public Director(Builder builder) {
        this.builder = builder;
    }

    //调用各个零件的建造方法
    public void construct(String toAddress, String fromAdress) {
        builder.buildToAddress(toAddress);
        builder.buildFromAddress(fromAdress);
        builder.buildSubject();
        builder.buildBody();
        builder.buildSendData();
    }
}

而在简化版本的建造者模式中,将导演者的职责交给产品对象。将具体建造者的部分职责(使用引用链组装对象)交由客户端

简化版本的建造模式:

public class Address {

    private String address;
    private String phone;

    //导演者角色的职责——组装对象
    Address(String address, String phone) {
        this.address = address;
        this.phone = phone;
    }
    //创建具体工厂角色
    public static AddressBuilder builder() {
        return new AddressBuilder();
    }

    //具体工厂
    public static class AddressBuilder {
        private String address;
        private String phone;

        //组装零件
        public AddressBuilder address(String address) {
            this.address = address;
            return this;
        }
        //组装零件
        public AddressBuilder phone(String phone) {
            this.phone = phone;
            return this;
        }
        //创建产品
        public Address build() {
            return new Address(this.address, this.phone);
        }
    }
}

总结:我们可以看到具体建造者角色目的是为了生产零件。而导演者角色执行组装算法。生产出合格的对象。

2. 模板方法模式

模板方法模式基于继承的代码复用。

模板方法模式的结构

重写父类的方法,在调用父类,会有不同的效果。将算法逻辑抽取出来,用户扩展类时,只需要关注子类的实现。

抽象模板角色

  • 基本方法:【访问权限为protected】,因为只由子类实现。
  • 模板方法:【可以使用final修饰】,模板方法不允许子类重写。

符合“开放-封闭”原则,即对扩展开放,对修改封闭。将公共逻辑抽取出来,放于抽象父类中(模板方法),这样,用户只需要关注具体方法的实现流程。

3. 总结

  • 建造模式是类的创建型模式,模板方法模式是类的行为型模式;
  • 两种都是将复杂的算法逻辑抽取出来,而程序员只需要关注零件/具体方法的实现。

你可能感兴趣的:(设计模式之区别-建造设计模式&&模板设计模式)