建造者设计模式:
使用多个简单的对象一步构建一个复杂的对象,这种类型的设计模式属于创建者模式。
介绍:
意图:将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
主要解决:有时候面临一个复杂对象的创建工作,其通常由各个部分的子对象使用一定的算法构成,由于需求的改变,这个复杂的对象的各个部分经常面临着剧烈的变化,但是将他们组合在一起的算法去相对稳定。
何时使用:一些基本不会变,而其组合经常变化的时候。
关键代码:建造者:创建和提供实例,导演:管理创建出来的实例的依赖关系。
应用实例:1去肯德基,可乐,汉堡以及鸡翅是不会变化的,但是客户点餐的套餐组合是不一样的。
优点:1建造者独立,容易扩展。2便于控制细节风险。
缺点:1产品必须具有共同点,范围有限制。2如果内部变化复杂,会导致有很多建造类。
使用场景:1需要生成的对象具有复杂的内部结构。2需要生成的对象内部属性本身相互依赖。
注意事项:与工厂模式不同,建造者模式更加强调零件之间的装配的顺序。
模式角色:
建造者角色:定义生成实例所需要的所有方法。
具体的建造者角色:实现生成实例所需要的所有方法,并且定义获取最终实例的方法。
监工角色:定义使用建造者角色中的方法来生成实例的方法。
使用者:使用建造者模式。
uml图:

Product类
import java.util.ArrayList;
import java.util.List;
//Product类,由多个部件组成。
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 item : parts) {
System.out.println(item);
}
}
}
Builder类:
//抽象建造类,确定产品由两个部件构成,parta,partb组成,
//并声明一个得到产品建造类结果的方法
public abstract class Builder {
public abstract void buildPartA();
public abstract void buildPartB();
public abstract Product getResult();
}
ConcreteBulider类:
//具体的建造类
public class ConcreteBuilder1 extends Builder{
private Product product=new Product();
@Override
public void buildPartA() {
// TODO 自动生成的方法存根
product.add("部件A");
}
@Override
public void buildPartB() {
// TODO 自动生成的方法存根
product.add("部件B");
}
@Override
public Product getResult() {
// TODO 自动生成的方法存根
return product;
}
}
public class ConcreteBuilder2 extends Builder{
private Product product=new Product();
@Override
public void buildPartA() {
// TODO 自动生成的方法存根
product.add("部件X");
}
@Override
public void buildPartB() {
// TODO 自动生成的方法存根
product.add("部件Y");
}
@Override
public Product getResult() {
// TODO 自动生成的方法存根
return product;
}
}
Director类:
//指挥者类,用来指挥创建过程
public class Director {
public void Construct(Builder builder) {
builder.buildPartA();
builder.buildPartB();
}
}
客户端代码:
public class Client {
//客户不需要知道具体的建造过程。
public static void main(String[] args) {
// TODO 自动生成的方法存根
Director director=new Director();
Builder builder=new ConcreteBuilder1();
Builder builder2=new ConcreteBuilder2();
//指挥者用concretebuilder的方法来建造产品。
director.Construct(builder);
Product p1=builder.getResult();
p1.show();
director.Construct(builder2);
Product product=builder2.getResult();
product.show();
System.out.println("==========");
}
}
总结:
建造者模式的使用场合是当创建复杂对象的时候,把创建对象成员和装配方法分离出来,放在建造者类中去实现,当用户使用该复杂对象的时候,不用理会它的创建和装配过程,只需要它的表现形式。
来源:https://www.cnblogs.com/dystar/p/10931875.html