创建者模式就是将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示,而且客户端不用知道对象的构建细节
我们先来了解一下为什么要用创建者模式:
假如我们要组装一台摩托车,我们需要螺丝、螺母、轮胎、发动机等许多零件,这些零件有的有联系有的没联系,但最终都会组装到一台摩托车上,假如我们用工厂模式或抽象工厂模式来设计,那么很难进行工厂类的划分,即使我们划分好了工厂类,各个零件由工厂创建后,如果在客户端对这些零件进行组装,那么将会是客户端显得异常庞大,如果我们把组建的过程放在工厂类里完成,那么又违反了类的单一职责,这是我们就要用到我们的Builder模式了。
既然要生产一台摩托车,我们首先设计一个抽象的摩托车类:
package com.dxy.design.pattern.builder;
public interface MotorCycle {
public void builder();
}
具体的摩托车类:
package com.dxy.design.pattern.builder;
public class MotorCycle1 implements MotorCycle{
@Override
public void builder() {
System.out.println("组建开始");
}
}
接着进行摩托车的零件类设计:
抽象的摩托车发动机类:
package com.dxy.design.pattern.builder;
public interface Engine {
public void build();
}
具体的发动机类:
package com.dxy.design.pattern.builder;
public class Engine1 implements Engine {
@Override
public void build() {
System.out.println("发动机开始创建");
}
}
抽象的轮胎类:
package com.dxy.design.pattern.builder;
public interface Tyre {
public void build();
}
具体的轮胎类:
package com.dxy.design.pattern.builder;
public class Tyre1 implements Tyre{
@Override
public void build() {
System.out.println("轮胎开始创建");
}
}
这里指列举两个零件,接下来我们创建一个抽象的工厂类,来定义摩托车的创建方式:
package com.dxy.design.pattern.builder.factory;
import com.dxy.design.pattern.builder.Engine;
import com.dxy.design.pattern.builder.Tyre;
public interface MotorCycleFactory {
public Engine createEngine();
public Tyre createTyre();
}
接着创建一个具体的工厂类来创建摩托车零件:
package com.dxy.design.pattern.builder.factory;
import com.dxy.design.pattern.builder.Engine;
import com.dxy.design.pattern.builder.Engine1;
import com.dxy.design.pattern.builder.Tyre;
import com.dxy.design.pattern.builder.Tyre1;
public class MotorCycleFactory1 implements MotorCycleFactory {
@Override
public Engine createEngine() {
return new Engine1();
}
@Override
public Tyre createTyre() {
return new Tyre1();
}
}
上文中提到,为了不使客户端过于臃肿,而又不违反类的单一职责,这里我们需要一个摩托车的组装类Builder:
package com.dxy.design.pattern.builder;
import com.dxy.design.pattern.builder.factory.MotorCycleFactory;
public class Builder {
private MotorCycleFactory mcf;
public Builder(MotorCycleFactory mcf) {
this.mcf = mcf;
}
public MotorCycle createMotorCycle() {
Engine engine = mcf.createEngine();
engine.build();
Tyre tyre = mcf.createTyre();
tyre.build();
return new MotorCycle1();
}
}
这样我们就可以在客户端进行简单调用了:
package com.dxy.design.pattern.builder;
import com.dxy.design.pattern.builder.factory.MotorCycleFactory1;
public class Client {
public static void main(String[] args) {
Builder builder = new Builder(new MotorCycleFactory1());
builder.createMotorCycle();
}
}
UML图如下:
大致上就是这样吧,不会画,以后再学吧