1.建造者模式的概念
建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式又叫“生成器模式”,建造者模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品。如果我们用了建造者模式,那么用户就只需指定需要建造的类型就可以得到他们,而具体建造的过程细节就不需要知道了。
2.建造者模式的结构图
Builder类:建造产品的各个部分的抽象类。
ConcreteBuilder类:具体建造者,继承Builder类,并实现Builder类中的方法,构造和装配各个部件。
Product类:产品角色,指具体的产品。
Director类:指挥者,构建一个使用Builder接口的对象
3.建造模式的代码实现
通过上面的结构图分析,我们可以很容易实现上面的流程,建造的模式的代码具体实现如下:
Product类(产品类,由多个部件组成):
package com.jxs.builder;
import java.util.ArrayList;
import java.util.List;
/**
* Created by jiangxs on 2018/5/7.
*
* @description: 产品类,由多个部件组成
*/
public class Product {
List<String> parts = new ArrayList<>();
// 添加产品部件
public void add(String part) {
parts.add(part);
}
// 列举所有的产品部件
public void show() {
System.out.println("\n产品 创建 ----");
for (String part : parts) {
System.out.println(part);
}
}
}
Builder类(抽象建造者类):
package com.jxs.builder;
/**
* Created by jiangxs on 2018/5/7.
*
* @description: 抽象建造类,确定产品由两个部件PartA和PartB组成,
* 并声明一个得到产品建造后结果的方法getResult
*/
public abstract class Builder {
public abstract void buildPartA();
public abstract void buildPartB();
public abstract Product getResult();
}
ConcreteBuilder1类(具体建造者类1):
package com.jxs.builder;
/**
* Created by jiangxs on 2018/5/7.
*
* @description: 具体建造类1
*/
public class ConcreteBuilder1 extends Builder {
private Product product = new Product();
@Override
public void buildPartA() {
product.add("部件A");
}
@Override
public void buildPartB() {
product.add("部件B");
}
@Override
public Product getResult() {
return product;
}
}
ConcreteBuilder2类(具体建造者类2):
package com.jxs.builder;
/**
* Created by jiangxs on 2018/5/7.
*
* @description: 具体建造类2
*/
public class ConcreteBuilder2 extends Builder {
private Product product = new Product();
@Override
public void buildPartA() {
product.add("部件X");
}
@Override
public void buildPartB() {
product.add("部件Y");
}
@Override
public Product getResult() {
return product;
}
}
Director类(指挥者类):
package com.jxs.builder;
/**
* Created by jiangxs on 2018/5/7.
*
* @description: 指挥者类
*/
public class Director {
public void construct(Builder builder) {
builder.buildPartA();
builder.buildPartB();
}
}
客户端:
package com.jxs.builder;
/**
* Created by jiangxs on 2018/5/7.
*/
public class Client {
public static void main(String[] args) {
Director director = new Director();
Builder builder1 = new ConcreteBuilder1();
Builder builder2 = new ConcreteBuilder2();
// 指挥者使用ConcreteBuilder1的方法来建造产品
director.construct(builder1);
Product product1 = builder1.getResult();
product1.show();
// 指挥者使用ConcreteBuilder2的方法来建造产品
director.construct(builder2);
Product product2 = builder2.getResult();
product2.show();
}
}
运行结果:
产品 创建 ----
部件A
部件B
产品 创建 ----
部件X
部件Y
Process finished with exit code 0
4.建造者模式总结
(1)建造模式的优点
①将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,使得我们能够更加精确的控制复杂对象的产生过程。
②将产品的创建过程与产品本身分离开来,可以使用相同的创建过程来得到不同的产品。也就说细节依赖抽象,符合依赖倒转原则。
③每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。
(2)建造模式的缺点
①建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
②如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
(3)建造模式使用场景
①需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性。
②隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。
③如果建造过程不稳定(即不确定一个产品由哪些组成),则不要使用建造模式。
注:
以上代码均可在github上进行下载:https://github.com/xsongj/designPattern
参考:《大话数据结构》