建造者模式
建造者模式,是为了构建一类具有相同执行顺序的但实现不一样,最后产生不一样的东西的效果。
举个例子,比如写作文。
每次写作文,我们大致有写标题,写开头,写内容,写结尾这些步骤。
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的时候,明明用了某种设计模式了,但他还没意识到是哪种模式,他只知道这样做是最合适的,这种人已经把设计模式融会贯通了。
而那种刚学了一点设计模式就到处想用,到处乱用,以及把精力浪费在区分各个设计模式上的人,相当于只学会了部分招式,还远远没到内功心法的境界。
当然,以上两种人,都比那种招式也不想练,内功也不会的人要强千百倍。