工厂模式聚焦于创建出一个对象,而建造者除此之外还需要为创建的对象赋值。
简单来说,建造者模式=创建对象+属性赋值。
建造者模式适合创建类中包含多个参数且需要定制化的情况。
简单来说,建造者模式的目的就是创造一条龙服务:不仅创建出对象,顺便给属性赋值。
以计算机为例,计算机的性能大致由CPU,显卡,内存,硬盘这几个属性构成。
市面上更多的是已经组装好的成品,而不会让用户自己去配一台电脑出来。(当然自己也是可以配的)
市场根据需求分为游戏本,办公本以及娱乐本等等。不同的种类性能是不一样的。但会在一个大致的范畴。
如果将所有的CPU,显卡,硬盘等等排列组合,电脑的种类将难以计数。所以官方推出定制本不仅缩小了选择的难度。也提供了生产的方便。
写个Demo实现:
虚线以上可以理解为服务端,一下可以理解为客户端。
那么生产一个产品的流程大致是这样的:实例化一个建造者实现类和一个指挥者装配类,调用指挥者转配类中的build方法实现建造者实现类的setter方法从而达到实例化产品的目的。
为什么需要建造者接口类和建造者实现类?
接口类控制的是产品的生产标准(实例化标准),每一个具体的产品都需要实现该接口完成产品创建。
优点:提升了扩展性。(客户端也可以通过接口的实现来创建自定义产品)
为什么需要指挥者装配类?
调用建造者实用类的setter方法即可完成产品的实例化创建,但这一部分对于每一个产品来说都是相同的。
那么在实例化产品的过程中,完全可以把这个重复且无任何变化的过程封装起来。实现代码复用。
class Computer //产品类{ private String cpu; private String gpu; private String memory; private String hardpan; public String getCpu() { return cpu; } public void setCpu(String cpu) { this.cpu = cpu; } public String getGpu() { return gpu; } public void setGpu(String gpu) { this.gpu = gpu; } public String getMemory() { return memory; } public void setMemory(String memory) { this.memory = memory; } public String getHardpan() { return hardpan; } public void setHardpan(String hardpan) { this.hardpan = hardpan; } @Override public String toString() { return "Computer{" + "cpu='" + cpu + '\'' + ", gpu='" + gpu + '\'' + ", memory='" + memory + '\'' + ", hardpan='" + hardpan + '\'' + '}'; }}interface ComputerBuilder //建造者接口类{ void setCpu(); void setGpu(); void setMemeory(); void setHardpan(); Computer build();}class Hp_Game implements ComputerBuilder //建造者实现类{ private Computer computer=new Computer(); @Override public void setCpu() { computer.setCpu("i7 8300"); } @Override public void setGpu() { computer.setGpu("rtx1080i"); } @Override public void setMemeory() { computer.setMemory("32g"); } @Override public void setHardpan() { computer.setHardpan("500G m2"); } @Override public Computer build() { return computer; }}class Hp_Work implements ComputerBuilder{ private Computer computer=new Computer(); @Override public void setCpu() { computer.setCpu("i6 7300"); } @Override public void setGpu() { computer.setGpu("MX250"); } @Override public void setMemeory() { computer.setMemory("4g"); } @Override public void setHardpan() { computer.setHardpan("500G SATA"); } @Override public Computer build() { return computer; }}class ComputerDirector //指挥者装配类{ public Computer build(ComputerBuilder cb) { cb.setCpu(); cb.setGpu(); cb.setMemeory(); cb.setHardpan(); return cb.build(); }}//=============================public class APPlication{ public static void main(String[] args) { Hp_Game hp01 = new Hp_Game(); Hp_Work hp02 = new Hp_Work(); ComputerDirector computerDirector = new ComputerDirector(); Computer computer_hp1=computerDirector.build(hp01); System.out.println(computer_hp1); Computer computer_hp02 =computerDirector.build(hp02); System.out.println(computer_hp02); }}
class Computer //产品类
{
private String cpu;
private String gpu;
private String memory;
private String hardpan;
public String getCpu() {
return cpu;
}
public void setCpu(String cpu) {
this.cpu = cpu;
public String getGpu() {
return gpu;
public void setGpu(String gpu) {
this.gpu = gpu;
public String getMemory() {
return memory;
public void setMemory(String memory) {
this.memory = memory;
public String getHardpan() {
return hardpan;
public void setHardpan(String hardpan) {
this.hardpan = hardpan;
@Override
public String toString() {
return "Computer{" +
"cpu='" + cpu + '\'' +
", gpu='" + gpu + '\'' +
", memory='" + memory + '\'' +
", hardpan='" + hardpan + '\'' +
'}';
interface ComputerBuilder //建造者接口类
void setCpu();
void setGpu();
void setMemeory();
void setHardpan();
Computer build();
class Hp_Game implements ComputerBuilder //建造者实现类
private Computer computer=new Computer();
public void setCpu() {
computer.setCpu("i7 8300");
public void setGpu() {
computer.setGpu("rtx1080i");
public void setMemeory() {
computer.setMemory("32g");
public void setHardpan() {
computer.setHardpan("500G m2");
public Computer build() {
return computer;
class Hp_Work implements ComputerBuilder
computer.setCpu("i6 7300");
computer.setGpu("MX250");
computer.setMemory("4g");
computer.setHardpan("500G SATA");
class ComputerDirector //指挥者装配类
public Computer build(ComputerBuilder cb)
cb.setCpu();
cb.setGpu();
cb.setMemeory();
cb.setHardpan();
return cb.build();
//=============================
public class APPlication
public static void main(String[] args) {
Hp_Game hp01 = new Hp_Game();
Hp_Work hp02 = new Hp_Work();
ComputerDirector computerDirector = new ComputerDirector();
Computer computer_hp1=computerDirector.build(hp01);
System.out.println(computer_hp1);
Computer computer_hp02 =computerDirector.build(hp02);
System.out.println(computer_hp02);
定义一个建造者实现类实现建造者接口类,并完成setter定制即可。
class Computer //产品类{ private String cpu; private String gpu; private String memory; private String hardpan; public String getCpu() { return cpu; } public void setCpu(String cpu) { this.cpu = cpu; } public String getGpu() { return gpu; } public void setGpu(String gpu) { this.gpu = gpu; } public String getMemory() { return memory; } public void setMemory(String memory) { this.memory = memory; } public String getHardpan() { return hardpan; } public void setHardpan(String hardpan) { this.hardpan = hardpan; } @Override public String toString() { return "Computer{" + "cpu='" + cpu + '\'' + ", gpu='" + gpu + '\'' + ", memory='" + memory + '\'' + ", hardpan='" + hardpan + '\'' + '}'; }}interface ComputerBuilder //建造者接口类{ void setCpu(); void setGpu(); void setMemeory(); void setHardpan(); Computer build();}class Hp_Game implements ComputerBuilder //建造者实现类{ private Computer computer=new Computer(); @Override public void setCpu() { computer.setCpu("i7 8300"); } @Override public void setGpu() { computer.setGpu("rtx1080i"); } @Override public void setMemeory() { computer.setMemory("32g"); } @Override public void setHardpan() { computer.setHardpan("500G m2"); } @Override public Computer build() { return computer; }}class Hp_Work implements ComputerBuilder{ private Computer computer=new Computer(); @Override public void setCpu() { computer.setCpu("i6 7300"); } @Override public void setGpu() { computer.setGpu("MX250"); } @Override public void setMemeory() { computer.setMemory("4g"); } @Override public void setHardpan() { computer.setHardpan("500G SATA"); } @Override public Computer build() { return computer; }}class ComputerDirector //指挥者,复制给属性赋值{ public Computer build(ComputerBuilder cb) { cb.setCpu(); cb.setGpu(); cb.setMemeory(); cb.setHardpan(); return cb.build(); }}//=============================class Dell_Game implements ComputerBuilder{ private Computer computer=new Computer(); @Override public void setCpu() { computer.setCpu("i7 9300"); } @Override public void setGpu() { computer.setGpu("GTX1090"); } @Override public void setMemeory() { computer.setMemory("32g"); } @Override public void setHardpan() { computer.setHardpan("500G m2"); } @Override public Computer build() { return computer; }}public class APPlication{ public static void main(String[] args) {// Hp_Game hp01 = new Hp_Game();// Hp_Work hp02 = new Hp_Work(); ComputerDirector computerDirector = new ComputerDirector();// Computer computer_hp1=computerDirector.build(hp01);// System.out.println(computer_hp1);//// Computer computer_hp02 =computerDirector.build(hp02);// System.out.println(computer_hp02); Dell_Game dell_game = new Dell_Game(); Computer computer_Dell_game = computerDirector.build(dell_game); System.out.println(computer_Dell_game); }}
class ComputerDirector //指挥者,复制给属性赋值
class Dell_Game implements ComputerBuilder
computer.setCpu("i7 9300");
computer.setGpu("GTX1090");
// Hp_Game hp01 = new Hp_Game();
// Hp_Work hp02 = new Hp_Work();
// Computer computer_hp1=computerDirector.build(hp01);
// System.out.println(computer_hp1);
//
// Computer computer_hp02 =computerDirector.build(hp02);
// System.out.println(computer_hp02);
Dell_Game dell_game = new Dell_Game();
Computer computer_Dell_game = computerDirector.build(dell_game);
System.out.println(computer_Dell_game);
建造者模式的目的是创建对象并给属性赋值;
换个角度思考,实现接口的建造者实现类在定义的时候就是为了实现产品类的(而具体的产品类是固定的)。所以这个类本身的目的就是为了实例化另外一个类。而指挥者通过调用这个类的setter方法完成对产品类的属性赋值。
建造者模式的核心目的是创建出带有实例化属性的对象,而且有良好的扩展性。(符合开闭原则)
建造者要建造啥——开箱即用的产品。
原文链接:http://www.cnblogs.com/noneplus/p/11342846.html
本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728