现象:
设计模式-创建型设计模式-建造者模式学习
实现:
将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。适合创建复杂的对象
方法:
一:创建产品对象。多个部分组成(组成部门也可以是其他对象)
/**
* 产品角色:包含多个部件的对象
*/
public class Product {
// 产品的A部分
private String partA;
// 产品的B部分
private String partB;
// 产品的C部分
private String partC;
public String getPartA() {
return partA;
}
public void setPartA(String partA) {
this.partA = partA;
}
public String getPartB() {
return partB;
}
public void setPartB(String partB) {
this.partB = partB;
}
public String getPartC() {
return partC;
}
public void setPartC(String partC) {
this.partC = partC;
}
//展示对象信息
public void show(){
System.out.println("信息展示:"+partA+"-"+partB+"-"+partC);
}
}
二:抽象类 建造者
/**
* 抽象类 建造者
*/
abstract class AbstractBuildProduct {
// 产品对象
Product product = new Product();
//创建A部分抽象方法
public abstract void buildPartA();
//创建B部分抽象方法
public abstract void buildPartB();
//创建C部分抽象方法
public abstract void buildPartC();
public Product getProduct(){
return product;
};
}
三: 产品的具体创建者(工人) 继承抽象类
/**
* 产品的具体创建者 继承抽象类
*/
public class BuildProduct extends AbstractBuildProduct{
@Override
public void buildPartA() {
product.setPartA("创建产品A部分");
}
@Override
public void buildPartB() {
product.setPartB("创建产品B部分");
}
@Override
public void buildPartC() {
product.setPartC("创建产品C部分");
}
}
四:产品创建的指挥者
/**
* 产品创建的指挥者
*/
public class Commander {
private BuildProduct buildProduct;
//设置创建者
public void setBuildProduct(BuildProduct buildProduct) {
this.buildProduct = buildProduct;
}
//产品构建与组装方法
public Product construct() {
//分步创建产品
buildProduct.buildPartA();
buildProduct.buildPartB();
buildProduct.buildPartC();
return buildProduct.getProduct();
}
}
五:创建指挥者指挥创建产品
//创建具体产品的创建者
BuildProduct buildProduct=new BuildProduct();
//创建指挥者
Commander commander=new Commander();
commander.setBuildProduct(buildProduct);
//指挥工人创建产品
Product product = commander.construct();
//展示产品
product.show();
结果:
信息展示:创建产品A部分-创建产品B部分-创建产品C部分
具体实例:
创建具体的计算机
计算机包括显示屏+主机+物流方式属性
一:创建显示屏、主机、计算机类
/**
* 显示器
*/
@Data
public class Monitor {
//大小
private String size;
//颜色
private String colour;
public Monitor(String size, String colour) {
this.size=size;
this.colour=colour;
}
}
/**
* 主机
*/
@Data
public class MasterHost {
//cpu
private String cpu;
//内存
private String memory;
public MasterHost(String cpu, String memory) {
this.cpu=cpu;
this.memory=memory;
}
}
//具体产品
@Data
public class Product {
//显示器
private Monitor monitor;
//主机
private MasterHost masterHost;
//物流方式
private String type;
public void show(){
System.out.println("产品展示:");
System.out.println("显示器:"+monitor);
System.out.println("主机:"+masterHost);
System.out.println("物流方式:"+type);
}
}
二:创建具体主机/显示器对象方法
/**
* 创建具体主机/显示器对象
*/
public class Resources {
public Monitor getMonitor(){
return new Monitor("11","s");
}
public MasterHost getMasterHost(){
return new MasterHost("cpu","14");
}
}
三:抽象类建筑者
/**
* 抽象类 建造者
*/
abstract class AbstractBuildProduct {
// 产品对象
Product product = new Product();
//创建显示器抽象方法
public abstract void buildPartA(Monitor monitor);
//创建主机抽象方法
public abstract void buildPartB(MasterHost masterHost);
//创建物流抽象方法
public abstract void buildPartC(String type);
public Product getProduct(){
return product;
};
}
四:产品的具体创建者 继承抽象类
/**
* 产品的具体创建者 继承抽象类
*/
public class BuildProduct extends AbstractBuildProduct{
@Override
public void buildPartA(Monitor monitor) {
product.setMonitor(monitor);
}
@Override
public void buildPartB(MasterHost masterHost) {
product.setMasterHost(masterHost);
}
@Override
public void buildPartC(String type) {
product.setType(type);
}
}
五:产品创建的指挥者
/**
* 产品创建的指挥者
*/
public class Commander {
private BuildProduct buildProduct;
//设置创建者
public void setBuildProduct(BuildProduct buildProduct) {
this.buildProduct = buildProduct;
}
private Resources resources = new Resources();
//产品构建与组装方法
public Product construct(String type) {
//分步创建产品(控制产品的生产循序+返回具体的产品)
buildProduct.buildPartA(resources.getMonitor());
buildProduct.buildPartB(resources.getMasterHost());
buildProduct.buildPartC(type);
return buildProduct.getProduct();
}
}
六:调用测试
//创建具体产品的创建者
BuildProduct buildProduct=new BuildProduct();
//创建指挥者
Commander commander=new Commander();
commander.setBuildProduct(buildProduct);
//指挥工人创建产品(提供产品的要求)
Product product = commander.construct("顺丰");
//展示产品
product.show();
结果:
产品展示:
显示器:Monitor(size=11, colour=s)
主机:MasterHost(cpu=cpu, memory=14)
物流方式:顺丰