建造者模式
简介
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。
类图
实现方式
以我们的最常用的电脑为例,电脑是一个抽象的概念,但是具体型号组装好的电脑就是一个个实体。我们组装电脑就是一个复杂对象的创建过程,电脑包括了CPU,主板,内存,硬盘等重要的部件。这些部件都是缺一不可的,无论缺少那个电脑都是不正常的。
使用抽象类定义电脑的重要部件,这里只列举场景的重要部件,独显什么的先不考虑
package com.rabbit.pattern.builder;
/**
* 抽象电脑类
* Created by vip on 2018/3/19.
*/
public abstract class AbstractComputer {
//显示器
public abstract void display();
//CPU
public abstract void cpu();
//内存条
public abstract void memory();
//硬盘
public abstract void disk();
//主板
public abstract void mainboard();
//键盘
public abstract void keyboard();
//鼠标
public abstract void mouse();
//机箱
public abstract void crate();
}
电脑的抽象定义出来了,接下来就要定义具体的组装
package com.rabbit.pattern.builder;
/**
* 联想天逸510Pro电脑配置
* Created by vip on 2018/3/19.
*/
public class TianYiComputer extends AbstractComputer {
@Override
public void display() {
System.out.println("联想23英寸超大屏幕");
}
@Override
public void cpu() {
System.out.println("Intel Core I5-7400,三级缓存6MB,4核,3.00GHz");
}
@Override
public void memory() {
System.out.println("DDR4 8G内存,最大扩容到32G");
}
@Override
public void disk() {
System.out.println("1TB超大容量内存,转速7200转/分钟");
}
@Override
public void mainboard() {
System.out.println("因特尔主板");
}
@Override
public void keyboard() {
System.out.println("联想无线键盘");
}
@Override
public void mouse() {
System.out.println("联想无线鼠标");
}
@Override
public void crate() {
System.out.println("联想自主研发ideacentre机箱");
}
}
联系天逸510Pro电脑已经定义好了,接下来就是对象的创建问题。正常的创建过程
package com.rabbit.pattern.builder;
/**
* Created by vip on 2018/3/19.
*/
public class Demo {
public static void main(String[] args) {
//电脑创建好了
AbstractComputer ac = new TianYiComputer();
//组装
ac.mouse();
ac.memory();
ac.disk();
}
}
运行结果:
问题:这样组装出来的电脑万一那个用户用了不是问题大了吗?只有鼠标,内存,和硬盘就说组装好了电脑。那么应该如何规范这个对象的创建呢?
这个就是建造者模式的好处,可以将复杂对象的创建和具体开来。那我们就需要添加一个指挥者类,用于构建复杂对象。
package com.rabbit.pattern.builder;
/**
* 负责调度创建AbstarctComputer的具体对象
* Created by vip on 2018/3/19.
*/
public class ComputerDirector {
private AbstractComputer ac;
public ComputerDirector(AbstractComputer ac) {
this.ac = ac;
}
public void create() {
//复杂对象的创建
//电脑组装对象的创建这些都是必要的
//总不能电脑组装少个CPu或者主板什么零件吧
ac.cpu();
ac.crate();
ac.disk();
ac.display();
ac.keyboard();
ac.mainboard();
ac.memory();
ac.mouse();
}
}
通过指挥者帮助我们创建好实例
package com.rabbit.pattern.builder;
/**
* Created by vip on 2018/3/19.
*/
public class Demo {
public static void main(String[] args) {
new ComputerDirector(new TianYiComputer()).create();
}
}
组装电脑结果,这样就可以避免由于那个零件没有组装而出现问题。可能会有人想说我可以把所有的方法都调用一遍,这样不是和指挥者类一样吗?建造者模式的出现就是为了避免复杂对象的创建过程出现其他问题而出现的,指挥者可以指定对象如何创建。这里只是简单的介绍建造者模式的具体思想和简单案例,具体到项目中还需要自己去思考理解透对应的模式才可以应对各种情况。
总结
使用场景
1、需要生成的对象具有复杂的内部结构。
2、需要生成的对象内部属性本身相互依赖。
优点
1、建造者独立,易扩展。
2、便于控制细节风险。
缺点
1、产品必须有共同点,范围有限制。
2、如内部变化复杂,会有很多的建造类。