版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fengyu6623/article/details/87783248
什么是建造者模式
致力于将一系列相似又特异的对象的复杂的创建细节所隐藏的一种创建类设计模式。
为什么要用建造者模式
类比于手机代工厂。比如有一个手机代工厂 代工A和B两种品牌手机,且AB手机各有有两种型号,这里假设型号分别为A1,A2,B1,B2。工厂为了加工手机,开了两个车间,分别为车间A和车间B。车间A里又有两条生产线,分别加工A1和A2。车间B同样分为两条生产线B1和B2。这样我们需要什么手机就去相应的车间获取就行了,如果有新的需求要建造新款的手机,也很好办,新开一条建造生产线就ok了。
这里我们看到创建手机这样一个对象是个很复杂的过程,而且不同品牌型号的手机的创建过程也存在着或多或少的差异性,如果一股脑的放在一起加工势必会搞的非常乱。所以建造者模式就是这样一个分车间分生产线的创建模式,将差异化的复杂创建过程隐藏在创建者模式下,而对外层只暴露出需要的对象。
换言之,一句话总结:即保留了底层对象创建的自由度,又对外屏蔽了自由度所带来的复杂度。
这个自由度在例子中就是指不同手机产品加工的不同的复杂度,即使同一品牌不同型号的手机也存在因为价格功能定位的不同而在零部件组装上面也存在这样的差异自由度。
如果上面的描述让你对建造者模式有了个大概的概念后,现在我们来将这个工厂的组成抽象类别下建造者模式里的组成。
我们先提取工厂中几个对象。车间,生产线,手机。
对应于建造者模式中分别为:导演类,建造类,产品类。
建造者模式组成
抽象产品类
public abstract class Product {
private String name;
private List<String> parts = new ArrayList<>();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<String> getParts() {
return parts;
}
public void setParts(List<String> parts) {
this.parts = parts;
}
}
具体产品类
public class AProduct extends Product {
public void doPart1(){
super.getParts().add("a-part1");
}
public void doPart2(){
super.getParts().add("a-part2");
}
}
public class BProduct extends Product{
public void doPart1(){
super.getParts().add("b-part1");
}
public void doPart2(){
super.getParts().add("b-part2");
}
public void doPart3(){
super.getParts().add("b-part3");
}
}
抽象建造者
public abstract class Builder {
public abstract void doPart();
public abstract Product buildProduct();
}
具体建造者
public class A1Builder extends Builder {
private AProduct product = new AProduct();
@Override
public void doPart() {
product.setName("A-1");
product.getParts().clear();
product.doPart1();
product.doPart2();
}
@Override
public Product buildProduct() {
return product;
}
}
public class A2Builder extends Builder {
private AProduct product = new AProduct();
@Override
public void doPart() {
product.setName("A-2");
product.getParts().clear();
product.doPart2();
}
@Override
public Product buildProduct() {
return product;
}
}
public class B1Builder extends Builder {
private BProduct product = new BProduct();
@Override
public void doPart() {
product.setName("B-1");
product.getParts().clear();
product.doPart1();
product.doPart3();
}
@Override
public Product buildProduct() {
return product;
}
}
public class B2Builder extends Builder {
private BProduct product = new BProduct();
@Override
public void doPart() {
product.setName("B-2");
product.getParts().clear();
product.doPart2();
product.doPart3();
}
@Override
public Product buildProduct() {
return product;
}
}
导演类
public class ADirector {
private Builder a1builder = new A1Builder();
private Builder a2builder = new A2Builder();
public Product getA1Product() {
a1builder.doPart();
return a1builder.buildProduct();
}
public Product getA2Product() {
a2builder.doPart();
return a2builder.buildProduct();
}
}
public class BDirector {
private Builder b1builder = new B1Builder();
private Builder b2builder = new B2Builder();
public Product getB1Product() {
b1builder.doPart();
return b1builder.buildProduct();
}
public Product getB2Product() {
b2builder.doPart();
return b2builder.buildProduct();
}
}
测试驱动
public class Main {
public static void main(String[] args) {
ADirector aDirector = new ADirector();
Product a1Product = aDirector.getA1Product();
BDirector bDirector = new BDirector();
Product b2Product = bDirector.getB2Product();
}
}
一些补充说明
为什么要有‘导演类’。如果没有导演类,对于使用方来说要创建对象就得深入到建造者内部,所以导演类在这里扮演的是一个更高层的角色,以此来屏蔽建造者内部的具体对象建造过程。