建造者模式(Builder pattern)
应用场景
当我们需要构造一个复杂的产品,比如:手机,汽车等。我们不仅需要构建各个零件,还有将这些零件组装在一起
发开中场景
1:StringBuilder类的append方法
2:SQL中的PreparedStatement
3:JDOM中,DomBuilder、SAXBuilder
本质
分离了对象子组件的单独构造(由Bulider负责)和装配(由Director负责),实现了构建和装配的解耦。不同的构建器,相同的装配顺序也可以做出不同的对象。相同的构建器,不同的装配顺序也可以做出不同的对象。也就是实现了构建算法、装配算法的解耦,实现了更好的复用。
案例(生产Iphone手机)
Iphone手机类public class Iphone {
private Battery battery; //电池
private Processor processor; //处理器
private Shell shell; //外壳
public Battery getBattery() {
return battery;
}
public void setBattery(Battery battery) {
this.battery = battery;
}
public Processor getProcessor() {
return processor;
}
public void setProcessor(Processor processor) {
this.processor = processor;
}
public Shell getShell() {
return shell;
}
public void setShell(Shell shell) {
this.shell = shell;
}
}
//定义电池类
class Battery{
private String name;
public Battery() {
}
public Battery(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//定义处理器类
class Processor{
private String name;
public Processor() {
}
public Processor(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//定义外壳类
class Shell{
private String name;
public Shell() {
}
public Shell(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
手机部件构造器接口
public interface IphoneBuilder {
//各个部件构造器
public abstract Battery builderBattery();
public abstract Processor builderProcessor();
public abstract Shell Shell();
}
手机部件组装器接口
public interface IphoneDirectory {
//手机组装器
public abstract Iphone directIphone();
}
构造完毕,开始自作自己的Iphone
美版Iphone构造器
public class UsaIphoneBuilder implements IphoneBuilder{
public Battery builderBattery() {
System.out.println("构建美版IPhone电池!");
return new Battery("美版IPhone电池");
}
public Processor builderProcessor() {
System.out.println("构建美版IPhone处理器!");
return new Processor("美版IPhone处理器");
}
public Shell Shell() {
System.out.println("构建美版IPhone外壳!");
return new Shell("美版IPhone外壳");
}
}
美版Iphone组装器
public class UsaIphoneDirectory implements IphoneDirectory{
/*
* 如果需要组装这部美版IPhone。第一步需要构建各个组件
*/
private IphoneBuilder builder;
//美版iPhone组装器构造器
public UsaIphoneDirectory(){
}
public UsaIphoneDirectory(IphoneBuilder builder){
this.builder = builder;
}
//重写组装器方法,组装各类部件
public Iphone directIphone() {
/*
* 创建各种部件
*/
Battery battery = builder.builderBattery();
Processor processor = builder.builderProcessor();
Shell shell = builder.builderShell();
/*
* 创建组装器,将其所有部件组装
*/
Iphone iphone = new Iphone();
iphone.setBattery(battery);
iphone.setProcessor(processor);
iphone.setShell(shell);
return iphone;
}
}
用户测试
public class Client {
public static void main(String[] args) {
IphoneDirectory directory = new UsaIphoneDirectory(new UsaIphoneBuilder());
Iphone iphone = directory.directIphone();
System.out.println(iphone.getProcessor().getName());
System.out.println(iphone.getBattery().getName());
System.out.println(iphone.getShell().getName());
iphone.prepare();
}
}
console:
构建美版IPhone电池!
构建美版IPhone处理器!
构建美版IPhone外壳!
美版IPhone处理器
美版IPhone电池
美版IPhone外壳