什么是建造者設計模式?和工廠設計模式有什么區別
建造者設計模式(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,您可以輕松地實現創建者設計模式,減少樣板代碼,提高代碼可讀性。