一. 什么是建造者模式
通過將對象的構建過程從表現(xiàn)層隔離出來,使得相同的構建過程可以用來創(chuàng)建不同的表現(xiàn)形式
二. 建造者模式解決了什么問題
用于簡化和優(yōu)化復雜對象的創(chuàng)建過程,提高創(chuàng)建效率和代碼可讀性;
三. 核心概念
3.1 四個角色
- Product(產(chǎn)品角色): 要創(chuàng)建的產(chǎn)品對象
- Builder(抽象建造者): 創(chuàng)建產(chǎn)品以及部件的接口定義
- ConcreateBuilder(具體建造者): 抽象建造者的具體實現(xiàn)
- Director(指揮者): 使用Builder接口的對象;
3.2 類圖
以手機制造為例
制造蘋果手機和小米手機
四. 代碼演示
/**
* 手機 產(chǎn)品
*
* @author cans
* @date 2024/2/18
**/
public class PhoneProduct {
private String cpu;
private String arm;
private String disk;
public void setCpu(String cpu) {
this.cpu = cpu;
}
public void setArm(String arm) {
this.arm = arm;
}
public void setDisk(String disk) {
this.disk = disk;
}
@Override
public String toString() {
return "PhoneProduct{" +
"cpu='" + cpu + '\'' +
", arm='" + arm + '\'' +
", disk='" + disk + '\'' +
'}';
}
}
/**
* 手機抽象建造者
*/
public interface PhoneBuilder {
void buildCpu();
void BuildArm();
void buildDisk();
PhoneProduct build();
}
/**
* 蘋果手機建造者實現(xiàn)
*
* @author cans
* @date 2024/2/18
**/
public class IPhoneBuilderImpl implements PhoneBuilder {
private final PhoneProduct product;
public IPhoneBuilderImpl() {
product = new PhoneProduct();
}
@Override
public void buildCpu() {
product.setCpu("A15");
}
@Override
public void BuildArm() {
product.setArm("4G");
}
@Override
public void buildDisk() {
product.setDisk("512G");
}
@Override
public PhoneProduct build() {
return product;
}
}
/**
* 小米手機建造者實現(xiàn)
*
* @author cans
* @date 2024/2/18
**/
public class MiPhoneBuilderImpl implements PhoneBuilder {
private final PhoneProduct product;
public MiPhoneBuilderImpl() {
product = new PhoneProduct();
}
@Override
public void buildCpu() {
product.setCpu("澎湃S1");
}
@Override
public void BuildArm() {
product.setArm("12G");
}
@Override
public void buildDisk() {
product.setDisk("1024G");
}
@Override
public PhoneProduct build() {
return product;
}
}
/**
* 手機創(chuàng)建 - 指揮者
* @author cans
* @date 2024/2/18
**/
public class PhoneDirector {
private PhoneBuilder builder;
public PhoneDirector(PhoneBuilder phoneBuilder){
this.builder = phoneBuilder;
}
public void build() {
builder.buildCpu();
builder.BuildArm();
builder.buildDisk();
}
}
測試代碼1: 生產(chǎn)蘋果手機
@Test
public void buildIPhone(){
PhoneBuilder builder = new IPhoneBuilderImpl();
PhoneDirector director = new PhoneDirector(builder);
director.build();
PhoneProduct product = builder.build();
System.out.println(product);
}
測試1輸出:
PhoneProduct{cpu='A15', arm='4G', disk='512G'}
Process finished with exit code 0
測試代碼2: 生產(chǎn)小米手機
只需要更換對應的建造者實現(xiàn)即可文章來源:http://www.zghlxwxcb.cn/news/detail-827003.html
@Test
public void buildMiPhone(){
PhoneBuilder builder = new MiPhoneBuilderImpl();
PhoneDirector director = new PhoneDirector(builder);
director.build();
PhoneProduct product = builder.build();
System.out.println(product);
}
測試2輸出:文章來源地址http://www.zghlxwxcb.cn/news/detail-827003.html
PhoneProduct{cpu='澎湃S1', arm='12G', disk='1024G'}
Process finished with exit code 0
五. 總結
優(yōu)勢
- 建造過程和使用分離(解耦): 使用的時候無需關心建造過程,使用相同的創(chuàng)建過程即可創(chuàng)建不同的復雜對象
- 每一個建造者都相對獨立(符合開閉原則): 可以很方便地替換具體建造者或增加新的具體建造者,擴展方便
- 對象創(chuàng)建更加精細化(可維護性增強): 復雜問題拆分簡單化,大大增強了代碼的后期可維護性;
劣勢
- 產(chǎn)品之前差異性太大的不適用建造者模式
- 如果產(chǎn)品屬性相互依賴,需要維護建造順序
到了這里,關于JAVA設計模式第九章:建造者模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!