一、生活場景 基於建造者模式,描述軟體開發的流程。 1、代碼實現 2、代碼結構圖 二、建造者模式 1、基礎概念 建造模式是對象的創建模式。建造模式可以將一個產品的內部屬性描述與產品的生產過程分割,從而可以使一個建造過程生成具有不同的內部表象的產品對象。也就是使用一個中介對象封裝一系列的對象交互,使其 ...
一、生活場景
基於建造者模式,描述軟體開發的流程。
1、代碼實現
/**
* 基於建造者模式描述軟體開發
*/
public class C01_InScene {
public static void main(String[] args) {
BuilderSoft builderSoft = new SoftImpl () ;
ProjectManager manager = new ProjectManager(builderSoft) ;
manager.createSoft();
}
}
/**
* 手機軟體產品開發
*/
class MobileSoft {
// 設計
private String design ;
// 架構
private String frame ;
// 開發
private String develop ;
// 上線
private String online ;
// 省略 GET SET 方法
}
/**
* 手機軟體流程抽象類
*/
abstract class BuilderSoft {
// 前期工作
public abstract void earlyWork () ;
// 中期工作
public abstract void midWork () ;
// 後期工作
public abstract void lateWork () ;
// 手機軟體完成
public abstract MobileSoft builderSoft () ;
}
/**
* 手機軟體具體實現
*/
class SoftImpl extends BuilderSoft {
private MobileSoft mobileSoft = new MobileSoft();
@Override
public void earlyWork() {
System.out.println("軟體前期設計...");
}
@Override
public void midWork() {
System.out.println("軟體中期架構...");
System.out.println("軟體中期開發...");
}
@Override
public void lateWork() {
System.out.println("軟體後期上線...");
}
@Override
public MobileSoft builderSoft() {
return mobileSoft ;
}
}
/**
* 項目經理:把控項目進度
*/
class ProjectManager {
private BuilderSoft builderSoft ;
ProjectManager (BuilderSoft builderSoft){
this.builderSoft = builderSoft ;
}
// 統籌項目周期
public void createSoft (){
builderSoft.earlyWork();
builderSoft.midWork();
builderSoft.lateWork();
// MobileSoft mobileSoft = builderSoft.builderSoft() ;
// return mobileSoft ;
}
}
2、代碼結構圖
二、建造者模式
1、基礎概念
建造模式是對象的創建模式。建造模式可以將一個產品的內部屬性描述與產品的生產過程分割,從而可以使一個建造過程生成具有不同的內部表象的產品對象。也就是使用一個中介對象封裝一系列的對象交互,使其各個對象不需要顯示的相互調用,而且可以單獨的改變對象之間的交互。
2、核心角色
1)、抽象建造者(Builder)角色
給出一個抽象介面,以規範產品對象的各個組成成分的建造。模式中直接創建產品對象的是具體建造者角色。
2)、具體建造者(ConcreteBuilder)角色
完成的任務包括:1.實現抽象建造者Builder所聲明的介面,給出完成創建產品實例的操作。2.在建造完成後,提供產品的實例。
3)、導演者(Director)角色
擔任這個角色的類調用具體建造者角色以創建產品對象。
4)、產品(Product)角色
產品便是建造的對象。一般來說,一個系統中會有多個產品類,而且這些產品類並不一定有共同的介面,而完全可以是不相關聯的。
3、模式圖解
4、源碼實現
/**
* 建造者模式代碼
*/
public class C02_Builder {
public static void main(String[] args) {
Builder builder = new ConcreteBuilder();
Director director = new Director(builder);
director.construct();
Product product = builder.builderProduct();
System.out.println(product.getAct1());
System.out.println(product.getAct2());
}
}
/**
* 產品類
*/
class Product {
/*定義一些產品的操作*/
private String act1;
private String act2;
public String getAct1() {
return act1;
}
public void setAct1(String act1) {
this.act1 = act1;
}
public String getAct2() {
return act2;
}
public void setAct2(String act2) {
this.act2 = act2;
}
}
/**
* Builder 抽象建造者類
*/
abstract class Builder{
public abstract void builderact1();
public abstract void builderact2();
public abstract Product builderProduct();
}
/**
* 具體建造者類
*/
class ConcreteBuilder extends Builder{
private Product product = new Product();
@Override
public void builderact1() {
product.setAct1("操作一:執行...");
}
@Override
public void builderact2() {
product.setAct2("操作二:執行...");
}
@Override
public Product builderProduct() {
return product;
}
}
/**
* Director 導演者類
*/
class Director{
/*使用建造者抽象類*/
private Builder builder;
Director(Builder builder){
this.builder = builder;
}
/*負責調用各個建造方法*/
public void construct(){
builder.builderact1();
builder.builderact2();
}
}
三、實際應用
1、JDK中應用
分析
1)、Appendable定義多個append() 抽象方法,抽象建造者。
2)、AbstractStringBuilder實現Appendable介面,已經作為了建造者,只是抽象類無法實例化。
3)、StringBuilder繼承AbstractStringBuilder,即作為具體建造者,也作為指揮者。
2、Spring中應用
源碼實現
// 系列方法
public BeanDefinitionBuilder setParentName(String parentName);
public BeanDefinitionBuilder setFactoryMethod(String factoryMethod);
public BeanDefinitionBuilder setFactoryMethodOnBean(String factoryMethod, String factoryBean);
public BeanDefinitionBuilder addConstructorArgValue(@Nullable Object value);
public BeanDefinitionBuilder addConstructorArgReference(String beanName);
public BeanDefinitionBuilder addPropertyValue(String name, @Nullable Object value);
// 構建Bean
public AbstractBeanDefinition getRawBeanDefinition() {
return this.beanDefinition;
}
public AbstractBeanDefinition getBeanDefinition() {
this.beanDefinition.validate();
return this.beanDefinition;
}
上面兩處建造者模式的實際應用,都有點形散而神不散的感覺。
四、優缺點分析
- 優點:減少類之間的相互依賴,降低耦合度。
- 缺點:ConcreateBuilder變得臃腫龐大,邏輯複雜。
五、源代碼地址
GitHub地址:知了一笑
https://github.com/cicadasmile
碼雲地址:知了一笑
https://gitee.com/cicadasmile