建造者模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
1.解决的问题
平常一般创建对象,需要new,然后通过set方法给每个属性设置,当创建多个对象的时候,代码重复性高,这时候可以考虑使用,一方便创建对象,二.实现代码复用
2.应用场景
需要生成的产品对象有复杂的内部结构,这些产品对象具备共性;隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品
3.包含角色
在这样的设计模式中,有以下几个角色:1 builder:为创建一个产品对象的各个部件指定抽象接口。
2 ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并 提供一个检索产品的接口。
3 Director:构造一个使用Builder接口的对象。
4 Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的
4.java代码
builder:
public interface ComputerBuilder { void buildKeyboard(); void buildMonitor(); void buildHost(); Computer buildComputer(); }
ConcreteBuilder:
public class AppleComputerBuilder implements ComputerBuilder { private Computer computer; public AppleComputerBuilder(){ this.computer=new AppleComputer(); } @Override public void buildKeyboard() { computer.setKeyBoard("安装苹果电脑键盘"); } @Override public void buildMonitor() { computer.setMonitor("安装苹果电脑显示器"); } @Override public void buildHost() { computer.setHost("安装苹果电脑主机"); } @Override public Computer buildComputer() { return computer; } }
public class HPComputerBuilder implements ComputerBuilder { private Computer computer; public HPComputerBuilder(){ this.computer=new HPComputer(); } @Override public void buildKeyboard() { this.computer.setKeyBoard("安装惠普电脑键盘"); } @Override public void buildMonitor() { this.computer.setMonitor("安装惠普电脑显示器"); } @Override public void buildHost() { this.computer.setHost("安装惠普电脑主机"); } @Override public Computer buildComputer() { return computer; } }
director:
public class ComputerDirector { public Computer buildComputer(ComputerBuilder computerBuilder){ computerBuilder.buildMonitor(); computerBuilder.buildHost(); computerBuilder.buildKeyboard(); return computerBuilder.buildComputer(); } }
product:
public class Computer { private String keyBoard; private String monitor; private String host; public String getKeyBoard() { return keyBoard; } public void setKeyBoard(String keyBoard) { this.keyBoard = keyBoard; } public String getMonitor() { return monitor; } public void setMonitor(String monitor) { this.monitor = monitor; } public String getHost() { return host; } public void setHost(String host) { this.host = host; } @Override public String toString() { return "Computer{" + "keyBoard='" + keyBoard + '\'' + ", monitor='" + monitor + '\'' + ", host='" + host + '\'' + '}'; } }
public class HPComputer extends Computer { public HPComputer() { System.out.println("----组装惠普电脑"); } }
public class AppleComputer extends Computer { public AppleComputer(){ System.out.println("----组装苹果电脑"); } }
测试:
public static void main(String[] args) { ComputerDirector director=new ComputerDirector(); Computer appleComputer = director.buildComputer(new AppleComputerBuilder()); Computer hpComputer = director.buildComputer(new HPComputerBuilder()); System.out.println(appleComputer); System.out.println(hpComputer); }