[设计模式] ------ 建造者模式(对比模板模式)

建造者模式

建造者模式,是为了构建一类具有相同执行顺序的但实现不一样,最后产生不一样的东西的效果。

举个例子,比如写作文。

每次写作文,我们大致有写标题,写开头,写内容,写结尾这些步骤。

public abstract class Builder {

    abstract String 写标题();

    abstract String 写开头();

    abstract String 写内容();

    abstract String 写结尾();
}

那比如要写春游的文章,那就先实现对应的写标题,写开头,写内容,写结尾这些方法

public class 春游作文 extends Builder {

    @Override
    String 写标题() {
        return "春游";
    }

    @Override
    String 写开头() {
        return "今天,我们几个人去春游。";
    }

    @Override
    String 写内容() {
        return "我们去了哪里,看到什么风景,怎么怎么样。";
    }

    @Override
    String 写结尾() {
        return "啊!春游真好!真有意义啊!";
    }
}

再写个看电影

public class 看电影作文 extends Builder {
    @Override
    String 写标题() {
        return "看电影";
    }

    @Override
    String 写开头() {
        return "今天,我们几个人一起去看电影。";
    }

    @Override
    String 写内容() {
        return "去哪个电影院,看什么电影,有什么感触。。。";
    }

    @Override
    String 写结尾() {
        return "啊!电影真好看,下次还想看!";
    }
}

最后,来个指挥官(也可以理解成一个学生),他有一个方法就是写作文,只要传入对应的作文子类,他就能写出对应的作文(这个真的很像应试教育的感觉,条条框框都准备好了,你只需要把每个条条框框里面的内容做好就行)。

public class Director {
    public String 写作文(Builder builder){
        String 标题 = builder.写标题();
        String 开头 = builder.写开头();
        String 内容 = builder.写内容();
        String 结尾 = builder.写结尾();
        return 标题 + "\n" + 开头 + "\n" + 内容 + "\n" + 结尾;
    }
}

测试一把

public class TestMain {

    public static void main(String[] args) {

        Director director = new Director();
        String 春游作文 = director.写作文(new 春游作文());
        System.out.println(春游作文);

        System.out.println("===================================");
        System.out.println("============下一篇作文===============");
        System.out.println("====================================");

        String 看电影作文 = director.写作文(new 看电影作文());
        System.out.println(看电影作文);
    }
}

最终打印结果:

春游
今天,我们几个人去春游。
我们去了哪里,看到什么风景,怎么怎么样。
啊!春游真好!真有意义啊!
===================================
============下一篇作文===============
====================================
看电影
今天,我们几个人一起去看电影。
去哪个电影院,看什么电影,有什么感触。。。
啊!电影真好看,下次还想看!

建造者模式和模板模式比较

其实我认为这两个设计模式都是一个意思,没必要分开说

虽然网上各种说法,大部分都是硬要把两个分开讨论。
可是讨论到最后,还不就是继承那点东西么。
比如上面这个例子,如果你把最后那个Director类的方法,放在Builder中,不就是模板模式吗?

所以,我一般将这两个认为是一种设计模式,也可以叫模板建造者模式。

专业点讲,通用的分为以下几步

1、父类定义一系列方法
2、由父类指定顺序方法或新建一个类的顺序方法,定义各个方法之间的调用顺序。
3、子类继承父类,并重写对应的方法。
4、针对不同子类调用顺序方法,就会产生不同的效果,但整体执行顺序都在控制之内。

好吧,硬要区分的话:

建造者模式,就是第二步用新建一个类的顺序方法,方法入参是子类
模板模式,就是上面第二步由父类指定顺序方法,子类后面指定调用

总结

希望我们在开发中能随机应变,无招胜有招。

真正牛逼的开发,是他在coding的时候,明明用了某种设计模式了,但他还没意识到是哪种模式,他只知道这样做是最合适的,这种人已经把设计模式融会贯通了。

而那种刚学了一点设计模式就到处想用,到处乱用,以及把精力浪费在区分各个设计模式上的人,相当于只学会了部分招式,还远远没到内功心法的境界。

当然,以上两种人,都比那种招式也不想练,内功也不会的人要强千百倍。

发布了203 篇原创文章 · 获赞 186 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/java_zhangshuai/article/details/105108055