一、建造者模式
定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
JDK中使用到
• java.lang.StringBuilder#append()
• java.lang.StringBuffer#append()
• java.nio.ByteBuffer#put() (CharBuffer, ShortBuffer, IntBuffer,LongBuffer, FloatBuffer 和DoubleBuffer与之类似)
• javax.swing.GroupLayout.Group#addComponent()
• java.sql.PreparedStatement
• java.lang.Appendable的所有实现类
简单的建造者模式
产品类
import java.util.ArrayList;
import java.util.List;
/**
* Created with Intellij IDEA.
* User : Yebinghuan
* Created on 2017/8/15.
* Description :
* 产品类:由多个部件组成
*/
public class Product {
List<String> parts=new ArrayList<String>();
//添加产品部件
public void Add(String part){
parts.add(part);
}
public void show(){
System.err.println("产品创建-----");
parts.forEach(System.out::println);//lambda表达式 java8新特性
}
}
/**
* Created with Intellij IDEA.
* User : Yebinghuan
* Created on 2017/8/15.
* Description :
* Builder类:抽象建造者类,确定产品由两个部件PartA和PartB组成,并声明一个得到产品建造后的结果集
*/
public abstract class Builder {
//零件A
public abstract void PartA();
//零件B
public abstract void PartB();
public abstract Product GeteResult();
}
零件一
/**
* Created with Intellij IDEA.
* User : Yebinghuan
* Created on 2017/8/15.
* Description :
* 产品1
*/
public class ConcreteBuilderOne extends Builder {
Product parts=new Product();
@Override
public void PartA() {
parts.Add("水泥");
}
@Override
public void PartB() {
parts.Add("水");
}
@Override
public Product GeteResult() {
return parts;
}
}
零件2
/**
* Created with Intellij IDEA.
* User : Yebinghuan
* Created on 2017/8/15.
* Description :
* 产品2
*/
public class ConcreteBuilderTwo extends Builder{
Product parts=new Product();
@Override
public void PartA() {
parts.Add("混泥土");
}
@Override
public void PartB() {
parts.Add("鸟头");
}
@Override
public Product GeteResult() {
return parts;
}
}
创建一个装配类
/**
* Created with Intellij IDEA.
* User : Yebinghuan
* Created on 2017/8/15.
* Description :
* 指挥类
*/
public class Director {
public void Construct(Builder builder){
builder.PartA();
builder.PartB();
}
}
public class Main {
public static void main(String[] args) {
Director director=new Director();
Builder builderOne=new ConcreteBuilderOne();//产品一
Builder builderTwo=new ConcreteBuilderTwo();//产品二
director.Construct(builderOne);//组合成一个产品1
Product product=builderOne.GeteResult();
product.show();
director.Construct(builderTwo);
product=builderTwo.GeteResult();
product.show();
}
}
建造者模式分析
1、建造者模式可以让客户端不必知道产品内部如何装配;
2、 具体的建造者类之间都是相互独立的,增加了扩展性。
使用场景
已经知道要创建对象的基本固定轮廓,但是对象的内部组成构件又可能会有复杂的变化时使用。