建造者设计模式和工厂类设计模式有很多相似的地方,但非常重要的一点:建造者模式注重基本方法的调用顺序安排,而工厂类则侧重于创建对象.
1.关于建造者的几个概念:
①Builder:是一个抽象接口,规范建造者对于生产的产品的各个组成部分的建造。这个接口只是定一个规范,不涉及具体的建造,具体的建造让继承于它的子类(ConcreteBuilder)去实现。
②、ConcreteBuilder:实现builder接口,针对不同的商业逻辑,具体化各对象部分的建造,最后返回一个建造好的产品。
③、Director:导演类,负责安排已有模块的顺序。在指导中不涉及产品的创建,只负责保证复杂对象各部分被创建或按某种顺序创建。
④、Product:产品类。
先上代码:
产品类的抽象类:
package com.dgtech.builder;
import java.util.ArrayList;
public abstract class Person {
//决定人起床后做各种事情的顺序
public ArrayList<String> sequence = new ArrayList<String>();
//吃饭
public abstract void eat();
//洗脸
public abstract void wash();
//上厕所
public abstract void wc();
//人起床后会按照不同的顺序做不同的事
public void afterGetUp(){
for (int i = 0; i < sequence.size(); i++) {
if("eat".equals(sequence.get(i))){
eat();
}else if("wash".equals(sequence.get(i))){
wash();
}else if("wc".equals(sequence.get(i))){
wc();
}
}
}
public void setSequence(ArrayList<String> sequence){
this.sequence = sequence;
}
}
产品类的两个实现类
public class Man extends Person{
@Override
public void eat() {
System.out.println("男人吃米饭");
}
@Override
public void wash() {
System.out.println("男人用肥皂洗脸");
}
@Override
public void wc() {
System.out.println("男人上厕所很快");
}
}
public class Women extends Person{
@Override
public void eat() {
System.out.println("女人喝牛奶");
}
@Override
public void wash() {
System.out.println("女人用洗面奶洗脸");
}
@Override
public void wc() {
System.out.println("女人上厕所很慢");
}
}
准备好了产品类,下面进入builder
builder的抽象类
import java.util.ArrayList;
public abstract class Builder {
//按照子类提供的顺序造人
public abstract void setsequence(ArrayList<String> sequence);
//返回一个人
public abstract Person getPerson();
}
builder抽象类的两个实现类
import java.util.ArrayList;
public class ManBuilder extends Builder{
Man man = new Man();
public void setsequence(ArrayList<String> sequence) {
man.setSequence(sequence);
}
public Person getPerson() {
// TODO Auto-generated method stub
return this.man;
}
}
import java.util.ArrayList;
public class WomenBuilder extends Builder{
Women women = new Women();
public void setsequence(ArrayList<String> sequence) {
women.setSequence(sequence);
}
public Person getPerson() {
// TODO Auto-generated method stub
return this.women;
}
}
导演类:
package com.dgtech.builder;
import java.util.ArrayList;
public class Director {
ManBuilder manBuilder = new ManBuilder();
WomenBuilder womenBuilder = new WomenBuilder();
ArrayList<String> sequence = new ArrayList<String>();
//创建A类型的男人,先吃饭再上厕所最后洗脸
public Man getAMan(){
sequence.clear();
sequence.add("eat");
sequence.add("wc");
sequence.add("wash");
manBuilder.setsequence(sequence);
return (Man) manBuilder.getPerson();
}
//创建B类型的男人,先上厕所再吃饭最后洗脸
public Man getBMan(){
sequence.clear();
sequence.add("wc");
sequence.add("eat");
sequence.add("wash");
manBuilder.setsequence(sequence);
return (Man) manBuilder.getPerson();
}
//当然后面可以创建各种不同类型的男人和女人,这里不再赘述
}
client类(用户实现类):
public class Client {
public static void main(String[] args) {
Director director = new Director();
Man aMan = director.getAMan();
aMan.afterGetUp();
Man bMan = director.getBMan();
bMan.afterGetUp();
}
}
输出结果:
男人吃米饭
男人上厕所很快
男人用肥皂洗脸
男人上厕所很快
男人吃米饭
男人用肥皂洗脸
记住关键点:不同的方法顺序生产不同的产品,这个是建造者设计模式的核心
一般用在步骤复杂的产品类创建上,比如不同的步骤创建出来的对象不同