深入理解設計模式-創建型之建造者模式(與工廠區別)

什么是建造者設計模式?和工廠設計模式有什么區別

建造者設計模式(Builder Design Pattern)和工廠設計模式(Factory Design Pattern)都是面向對象設計中的創建型模式,但它們解決的問題和應用場景有所不同。

  • 建造者設計模式:

    • 建造者設計模式旨在解決復雜對象的創建問題,特別是當對象的構造過程非常復雜,需要一步步構建,并且具有多個可選參數或配置選項時。該模式的主要思想是將對象的構建過程表示分離,使得同樣的構建過程可以創建不同的表示。
  • 主要組件:

    • Director(指揮者):負責使用構造器接口來構建一個復雜對象。
    • Builder(構造器):定義對象的構建過程,包括設置屬性、添加部件等方法。
    • ConcreteBuilder(具體構造器):實現構造器接口,實現具體的構建方法。
    • Product(產品):最終構建出的復雜對象。

建造者模式的優點是將對象的構建過程封裝,使得代碼更加清晰,同時能夠靈活地構建不同的對象。

  • 工廠設計模式:

工廠設計模式旨在通過一個工廠來創建對象,將對象的創建過程封裝起來,客戶端代碼無需直接調用構造函數。它分為簡單工廠、工廠方法和抽象工廠等形式。

  • 主要組件:

    • Factory(工廠):負責創建對象的接口或類。
    • ConcreteFactory(具體工廠):實現工廠接口,實際創建對象的地方。
    • Product(產品):工廠創建的對象。

工廠模式的主要優點是將對象的創建和客戶端解耦,客戶端只需通過工廠來獲取對象,不需要關心對象的具體創建過程。

區別

  • 目的不同:

    • 建造者模式關注于創建復雜對象的構建過程,將構建過程和表示分離。
    • 工廠模式關注于對象的創建,將對象的創建過程封裝在工廠中,以便在客戶端中使用。
  • 復雜性:

    • 建造者模式通常用于創建復雜對象,因為對象的構建過程可能涉及多個步驟和配置選項。
    • 工廠模式可以用于創建不同類型的對象,包括簡單對象和復雜對象。
  • 關注點:

    • 建造者模式更關注于對象的**構建過程,**尤其適合需要按照一定步驟構建對象的情況。
    • 工廠模式更關注于對象的創建,強調封裝創建過程,便于對象創建的管理。

綜上所述,建造者模式適用于構建復雜對象,而工廠模式適用于創建對象的封裝和管理。選擇適當的模式取決于你的設計需求和對象創建的復雜性。

用java分別給出一個建造者和工廠例子

當實現建造者模式和工廠模式時,我們可以以一個簡單的示例來說明。假設我們要創建一個電腦對象,分別使用建造者模式和工廠模式。

建造者模式示例:

// 產品類
class Computer {private String cpu;private String memory;private String storage;public void setCPU(String cpu) {this.cpu = cpu;}public void setMemory(String memory) {this.memory = memory;}public void setStorage(String storage) {this.storage = storage;}// 其他方法...
}// 抽象建造者
interface ComputerBuilder {void buildCPU();void buildMemory();void buildStorage();Computer getResult();
}// 具體建造者
class GamingComputerBuilder implements ComputerBuilder {private Computer computer = new Computer();//產品類對象public void buildCPU() {computer.setCPU("Intel Core i7");}public void buildMemory() {computer.setMemory("16GB RAM");}public void buildStorage() {computer.setStorage("1TB SSD");}public Computer getResult() {return computer; //需要一步步創建(具體怎么創建指揮者說了算) 最后通過此方法返回Computer產品對象}
}// 指揮者
class Director {private ComputerBuilder builder;//接口類型public Director(ComputerBuilder builder) {this.builder = builder;}public void construct() {builder.buildCPU(); //指揮建造者來一步步創建builder.buildMemory();builder.buildStorage();}
}// 客戶端代碼
public class BuilderExample {public static void main(String[] args) {ComputerBuilder builder = new GamingComputerBuilder();//父類引用(這里是接口)指向子類對象(抽象建造者引用指向具體建造者)Director director = new Director(builder);//builder建造者對象傳入指揮者對象director.construct();//指揮者調用創建方法(此時指揮者已經 指揮建造者builder完成了創建即construct())Computer computer = builder.getResult();//建造者對象調用方法 返回產品類對象// 使用構建好的電腦對象System.out.println("Gaming Computer: " + computer.toString());}
}

工廠模式示例:

// 產品類
class Computer {private String type;private String cpu;private String memory;private String storage;public Computer(String type, String cpu, String memory, String storage) {this.type = type;this.cpu = cpu;this.memory = memory;this.storage = storage;}// 其他方法...
}// 抽象工廠
interface ComputerFactory {Computer createComputer();
}// 具體工廠
class GamingComputerFactory implements ComputerFactory {public Computer createComputer() {return new Computer("Gaming", "Intel Core i7", "16GB RAM", "1TB SSD");}
}// 客戶端代碼
public class FactoryExample {public static void main(String[] args) {ComputerFactory factory = new GamingComputerFactory();//父類引用(這里是接口)指向子類對象Computer computer = factory.createComputer();//從具體工廠中直接拿對象// 使用工廠創建的電腦對象System.out.println("Gaming Computer: " + computer.toString());}
}

在上述示例中,建造者模式通過在建造者接口中定義構建步驟來構建復雜對象,而工廠模式通過工廠接口的具體實現來創建對象。兩者在對象創建的過程和角色分配上有所不同。

源碼應用

創建者設計模式在源碼中有廣泛的使用常見:

1、jdk中,如StringBuilder和StringBuffer,他們的實現不是完全按照標準的創建者設計模式設計,但也是一樣的思想:

  • 這兩個類用于構建和修改字符串。它們實現了創建者模式,允許客戶端通過方法鏈來修改字符串。
  • 這些類在性能上優于 String 類,因為它們允許在同一個對象上執行多次修改,而不需要每次修改都創建一個新的對象。
StringBuilder builder = new StringBuilder();builder.append("Hello").append(" ").append("World!");String result = builder.toString();

2、在ssm源碼中很多類都使用創建者設計模式,如Spring中的

BeanDefinitionBuilder 類,mybatis中的 SqlSessionFactoryBuilder 、XMLConfigBuilder 、 XMLMapperBuilder 、 XMLStatementBuilder 、CacheBuilder 等,因為實現都比較簡單就不帶著大家一個一個看了。

3、使用lombok簡單的實現創建者設計模式

Lombok 是一個 Java 庫,它可以簡化代碼,提高開發效率,尤其是在實現模式和生成常用方法(例如 getter、setter、equals、hashCode 和 toString)時。要使用 Lombok 簡單地實現創建者設計模式,您可以使用 @Builder 注解。這將為您自動生成創建者類和相關方法。以下是一個使用 Lombok 的創建者設計模式的例子:
首先,確保您已經在項目中引入了 Lombok 庫。對于 Maven 項目,在 pom.xml 文件中添加以下依賴:

<dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.20</version><scope>provided</scope></dependency>
</dependencies>

然后,創建一個使用 Lombok 的創建者設計模式的類:

@Getter
@ToString
@Builderpublic class Person {private String name;private int age;private String address;
}

在上面的示例中,我們使用了 @Builder 注解來自動生成創建者類和相關方法。此外,我們還使用了 @Getter 注解來自動生成 getter 方法,以及 @ToString 注解來自動生成 toString 方法。
現在,您可以使用自動生成的創建者類創建 Person 對象:

Person person = Person.builder().name("John Doe").age(30).address("123 Main St").build();

通過 Lombok,您可以輕松地實現創建者設計模式,減少樣板代碼,提高代碼可讀性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/41752.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/41752.shtml
英文地址,請注明出處:http://en.pswp.cn/news/41752.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

原碼、反碼、補碼,進制轉換,有符號數和無符號數轉換

計算機底層存儲數據時&#xff0c;存儲的是數據對應的二進制數字。對于整型數據&#xff0c;其二進制表示形式有三種&#xff0c;分別是&#xff1a;原碼、反碼、補碼&#xff0c;而實際存儲的是整型數據的補碼。 原碼、反碼以及補碼都是有符號的&#xff0c;其中最高位存放符…

帶你掌握Stable Diffution商業級玩法

課程介紹 學習地址 《Stable Diffusion商業級玩法》通過詳細講解AI繪畫技巧、實操演示和個性化指導&#xff0c;幫助您從零基礎成為繪畫高手&#xff0c;幫助您有效推廣產品或服務&#xff0c;提升市場份額。教您掌握穩定擴散繪畫技巧&#xff0c;開啟藝術創作新篇章。

Opencv 之ORB特征提取與匹配API簡介及使用例程

Opencv 之ORB特征提取與匹配API簡介及使用例程 ORB因其速度較快常被用于視覺SLAM中的位姿估計、視覺里程、圖像處理中的特征提取與匹配及圖像拼接等領域本文將詳細給出使用例程及實現效果展示 1. API 簡介 創建 static Ptr<ORB> cv::ORB::create (int nfeatures 500…

無涯教程-Perl - use函數

描述 此函數將MODULE導出的所有功能(或僅LIST引用的功能)導入當前包的名稱空間。有效等效于- BEGIN { require "Module.pm"; Module->import(); }也用于在當前腳本上強加編譯器指令(編譯指示),盡管從本質上講它們只是模塊。 請注意,use語句在編譯時進行判斷。在…

springcloud3 hystrix實現服務熔斷的案例配置3

一 hystrix的熔斷原理 1.1 hystrix的熔斷原理 在springcloud的框架里&#xff0c;熔斷機制是通過hystrix實現&#xff0c;hystrix會監控服務之間的調用。當失敗調用達到一定的閾值&#xff0c;默認是5s內失敗20次&#xff0c;就會啟用hystrix的熔斷機制&#xff0c;使用命Hy…

神經網絡基礎-神經網絡補充概念-44-minibatch梯度下降法

概念 小批量梯度下降法&#xff08;Mini-Batch Gradient Descent&#xff09;是梯度下降法的一種變體&#xff0c;它結合了批量梯度下降&#xff08;Batch Gradient Descent&#xff09;和隨機梯度下降&#xff08;Stochastic Gradient Descent&#xff09;的優點。在小批量梯…

Apache Doris大規模數據使用指南

目錄 發展歷史 架構介紹 彈性MPP架構-極簡架構 邏輯架構 基本訪問架構 分區 創建單分區表

【C++ 記憶站】缺省參數

文章目錄 缺省參數的概念缺省參數的分類1、全缺省參數2、半缺省參數 缺省參數實際應用場景 缺省參數的概念 缺省參數是聲明或定義函數時為函數的參數指定一個缺省值。在調用該函數時&#xff0c;如果沒有指定實參則采用該形參的缺省值&#xff0c;否則使用指定的實參 正常調用一…

音頻解碼及如何在Java實現

本人并不干這個&#xff0c;但是被迫下水了解了一下這個&#xff0c;稍微做了一下整理。再就是感覺現在網上以及ChatGPT在這方面給出的答案太水了&#xff0c;在此開辟一篇。無意放出代碼&#xff0c;這里只介紹一些可能重要的點。 本來以為有了ChatGPT寫這些就沒有必要了&…

Docker部署ES服務,canal全量同步的時候內存爆炸,ES/Canal Adapter自動關閉,CPU100%

文章目錄 問題解決方案1. 對ES的限制2. 對Canal-Adapter的限制 問題 使用canal-adapter全量同步&#xff08;參考Canal Adapter1.1.5版本API操作服務&#xff0c;手動同步數據&#xff08;4&#xff09;&#xff09;的時候 小批量數據可以正常運行&#xff08;幾千條&#xf…

Llama 2免費托管及API提供

Llama 2 是 Meta 最新的文本生成模型&#xff0c;目前其性能優于所有開源替代方案。 推薦&#xff1a;用 NSDT編輯器 快速搭建可編程3D場景 1、強大的Llama 2 它擊敗了 Falcon-40B&#xff08;之前最好的開源基礎模型&#xff09;&#xff0c;與 GPT-3.5 相當&#xff0c;僅低…

【uni-app】 .sync修飾符與$emit(update:xxx)實現數據雙向綁定

最近在看uni-app文檔&#xff0c;看到.sync修飾符的時候&#xff0c;覺得很有必要記錄一下 其實uni-app是一個基于Vue.js和微信小程序開發框架的跨平臺開發工具 所以經常會聽到這樣的說法&#xff0c;只要你會vue&#xff0c;uni-app就不難上手 在看文檔的過程中&#xff0c;發…

.netcore grpc客戶端工廠及依賴注入使用

一、客戶端工廠概述 gRPC 與 HttpClientFactory 的集成提供了一種創建 gRPC 客戶端的集中方式。可以通過依賴包Grpc.Net.ClientFactory中的AddGrpcClient進行gRPC客戶端依賴注入AddGrpcClient函數提供了許多配置項用于處理一些其他事項&#xff1b;例如AOP、重試策略等 二、案…

miniExcel 生成excel

一、nuget dotnet add package MiniExcel --version 1.31.2 二、新建表及數據 ExampleProducts 三、這里我用了Dapper.Query方法 讀取excel public virtual async Task<IActionResult> Anonymous(){try{//using (var connection _dbContext.GetDbConnection())//{//…

linux中的ifconfig和ip addr

在linux操作系統中ifconfig和ip addr都是顯示網卡配置信息的命令&#xff0c;好多人有疑惑它們有什么區別呢 區別1&#xff1a;對于linux發行的版本不一樣 ip addr是對新發行版本的linux使用會比較多&#xff1b;而ifconfig是老版本遇到使用的會比較多。 區別2&#xff1a;顯…

神經網絡基礎-神經網絡補充概念-32-神經網絡與大腦

概念 神經網絡&#xff08;Neural Networks&#xff09;是受到生物神經系統啟發而設計的機器學習模型&#xff0c;用于處理和學習復雜的數據模式。盡管神經網絡的設計和工作原理與大腦有一些相似之處&#xff0c;但它們并不完全相同&#xff0c;以下是神經網絡和大腦之間的一些…

基于 KubeSphere 的應用容器化在智能網聯汽車領域的實踐

公司簡介 某國家級智能網聯汽車研究中心成立于 2018 年&#xff0c;是擔當產業發展咨詢與建議、共性技術研發中心、創新成果轉化的國家級創新平臺&#xff0c;旨在提高我國在智能網聯汽車及相關產業在全球價值鏈中的地位。 目前著力建設基于大數據與云計算的智能汽車云端運營…

RestTemplate

RestTemplate介紹 RestTemplate是Spring提供的用于訪問RESTful服務的客戶端&#xff0c;RestTemplate提供了多種便捷訪問遠程Http服務的方法,能夠大大提高客戶端的編寫效率。RestTemplate默認依賴JDK提供http連接的能力&#xff08;HttpURLConnection&#xff09;&#xff0c;…

js拼接字符串

在js中&#xff0c;你可以使用字符串拼接的方式創建新的字符串。 下面是一些常用的方法&#xff1a; 1、使用運算符&#xff1a; var str1 "Hello"; var str2 "World"; var result str1 " " str2; console.log(result); // 輸出&#xf…

【數據結構】鏈表常見題目

文章目錄 鏈表合并兩個有序鏈表反轉鏈表復制帶隨機指針的鏈表環形鏈表環形鏈表II相交鏈表移除鏈表元素鏈表中倒數第k個節點鏈表分割鏈表的回文結構鏈表的中間節點旋轉鏈表鏈表排序鏈表求和 (逆序求)鏈表求和II (正序求)重排鏈表奇偶鏈表反轉鏈表II <==> 鏈表內指定區間反…