一、前言
今天板凳君跟大家一起来学习java设计模式中的建造者模式,小编对建造者模式的理解就是使一个复杂的对象进行分模块处理,并且使这些模块各自独立,这样做的好处是什么呢?小编个人觉得这样可以使一个复杂的对象简单化,分模块之后可以对提高系统的维护性能,当然还可以有其他好处,但是(暂时想不出来)小编觉得这种设计模式最大的优点就是这个了。当然有缺点就必然有它的缺点啦,一旦模块化后,对应的类必然会增多,不过呢我觉得这种小缺点可以忽略啦!
二、建造者模式
老规矩,先来谈谈建造者模式的概念吧,我们可以用这样一句高逼格的话来描述:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示(表示不懂)。那么我们可以结合自己生活场景想想,要建造一个车我们是不是要分工呢?一个汽车的生产商一般不会生产全套的汽车部件,通常都是只生产自己核心技术的产品,因为这样厂商才可以有更多精力去投入生产自己具有核心竞争力的产品。好了,我们再回到我们的代码世界,再梳理一下对建造者模式的理解。当我们在代码中出现了有复杂对象的创建,或者有复杂计算的实现的时候,那么我们这时候就可以运用建造者模式来解决这样的场景,将复杂对象或复杂计算进行模块化,一部分一部分的实现,并将这些模块化的部分通过一个接口统一管理,用户可以通过这个接口自定义实现这个类或者算法。我们仔细想想,这种设计是不是有点架构的味道,我们将一个类或者算法的骨架抽取出来。用户可以自定义实现这个类或者算法(是不是有种框架师的感觉哈哈),小 编觉得这种设计模式对我们以后上升到架构的层次有巨大的帮助啊,所以我们在自己写代码的时候遇到相似场景一定要多运用这种思想。
三、代码展示
3.1 将汽车模块化的接口
public interface ICarBuilder {
/**
* 创建轮胎
* @return
*/
public Tyre buildTyre();
/**
* 创建内部零件
* @return
*/
public Internals buildInternals();
/**
* 创建外壳
* @return
*/
public Shell buildShell();
/**
* 创建汽车
* @return
*/
public Car buildCar();
}
3.2 创建一个自定义的汽车建造类
public class ConcreteCarBuilder implements ICarBuilder {
@Override
public Tyre buildTyre() {
// TODO Auto-generated method stub
System.out.println("创建轮胎");
return new Tyre("板凳品牌");
}
@Override
public Internals buildInternals() {
// TODO Auto-generated method stub
System.out.println("创建内部零件");
return new Internals("内部零件");
}
@Override
public Shell buildShell() {
// TODO Auto-generated method stub
System.out.println("创建外壳");
return new Shell("红色");
}
@Override
public Car buildCar() {
// TODO Auto-generated method stub
System.out.println("汽车创建好了");
return new Car(buildTyre(), buildInternals(), buildShell());
}
}
3.3 汽车类
public class Car {
private Tyre tyre;
private Internals internals;
private Shell shell;
public Car(Tyre tyre,Internals internals,Shell shell)
{
this.tyre = tyre;
this.internals = internals;
this.shell = shell;
}
public Car getCar()
{
return this;
}
}
3.4 零件类
/**
* 汽车部件
* @author Deng
*
*/
public class Internals {
private String message;
public Internals(String message) {
super();
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
public class Shell {
private String message;
public Shell(String message) {
super();
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
/**
* 轮胎类
* @author Deng
*
*/
public class Tyre {
private String brand;
public Tyre(String brand) {
super();
this.brand = brand;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
}
四、测试
public class Test {
public static void main(String[] args) {
ConcreteCarBuilder carBuilder = new ConcreteCarBuilder();
carBuilder.buildCar();
}
}