深入剖析Java工廠模式讓你的代碼更靈活
一、概述
1.1 什么是Java工廠模式
Java工廠模式是一種創(chuàng)建對(duì)象的設(shè)計(jì)模式,它提供了一種方法,通過該方法可以在不暴露對(duì)象創(chuàng)建邏輯的情況下,將對(duì)象的創(chuàng)建委托給子類或者其他對(duì)象。工廠模式可以隱藏對(duì)象的創(chuàng)建細(xì)節(jié),提高了代碼的可維護(hù)性、可擴(kuò)展性和可重用性。
工廠模式主要有三種類型:簡(jiǎn)單工廠、工廠方法和抽象工廠。這三種類型的工廠模式各有優(yōu)缺點(diǎn),在不同的場(chǎng)景下有不同的應(yīng)用。
二、簡(jiǎn)單工廠
2.1 什么是簡(jiǎn)單工廠
簡(jiǎn)單工廠模式是一種創(chuàng)建對(duì)象的工廠模式,它定義了一個(gè)工廠類,該工廠類根據(jù)傳遞的參數(shù)來決定創(chuàng)建哪種類型的對(duì)象。簡(jiǎn)單工廠模式適用于創(chuàng)建的對(duì)象比較少,且客戶端只需要知道創(chuàng)建對(duì)象的參數(shù)。
2.2 示例代碼
//抽象產(chǎn)品類
interface Product {
void show();
}
//具體產(chǎn)品類A
class ConcreteProductA implements Product {
public void show() {
System.out.println("This is product A");
}
}
//具體產(chǎn)品類B
class ConcreteProductB implements Product {
public void show() {
System.out.println("This is product B");
}
}
//工廠類
class SimpleFactory {
public static Product createProduct(String type) {
Product product = null;
if (type.equals("A")) {
product = new ConcreteProductA();
} else if (type.equals("B")) {
product = new ConcreteProductB();
}
return product;
}
}
//客戶端
public class Client {
public static void main(String[] args) {
Product productA = SimpleFactory.createProduct("A");
productA.show();
Product productB = SimpleFactory.createProduct("B");
productB.show();
}
}2.3 優(yōu)點(diǎn)和缺點(diǎn)
簡(jiǎn)單工廠模式的優(yōu)點(diǎn)是可以隱藏產(chǎn)品的創(chuàng)建細(xì)節(jié),客戶端不需要知道產(chǎn)品的創(chuàng)建過程,只需要傳遞相應(yīng)的參數(shù)即可得到想要的產(chǎn)品。簡(jiǎn)單工廠模式可以使客戶端和產(chǎn)品類解耦,提高代碼的可維護(hù)性和可擴(kuò)展性。
簡(jiǎn)單工廠模式的缺點(diǎn)是當(dāng)需要新增產(chǎn)品時(shí),需要修改工廠類的代碼,這違反了開閉原則。另外,簡(jiǎn)單工廠模式通常只有一個(gè)工廠類,如果產(chǎn)品種類較多,工廠類的代碼會(huì)變得比較臃腫,不易于維護(hù)。
三、工廠方法
3.1 什么是工廠方法
工廠方法模式是一種創(chuàng)建對(duì)象的工廠模式,它定義了一個(gè)抽象工廠類,該抽象工廠類有一個(gè)工廠方法,該工廠方法返回一個(gè)產(chǎn)品對(duì)象。具體的產(chǎn)品對(duì)象由實(shí)現(xiàn)該抽象工廠類的子類來創(chuàng)建,這樣每個(gè)具體工廠類只負(fù)責(zé)創(chuàng)建特定的產(chǎn)品對(duì)象,從而將客戶端和具體產(chǎn)品解耦。
工廠方法模式通常包括四個(gè)角色:抽象產(chǎn)品類、具體產(chǎn)品類、抽象工廠類和具體工廠類。
3.2 示例代碼
//抽象產(chǎn)品類
interface Product {
void show();
}
//具體產(chǎn)品類A
class ConcreteProductA implements Product {
public void show() {
System.out.println("This is product A");
}
}
//具體產(chǎn)品類B
class ConcreteProductB implements Product {
public void show() {
System.out.println("This is product B");
}
}
//抽象工廠類
interface Factory {
Product createProduct();
}
//具體工廠類A
class ConcreteFactoryA implements Factory {
public Product createProduct() {
return new ConcreteProductA();
}
}
//具體工廠類B
class ConcreteFactoryB implements Factory {
public Product createProduct() {
return new ConcreteProductB();
}
}
//客戶端
public class Client {
public static void main(String[] args) {
Factory factoryA = new ConcreteFactoryA();
Product productA = factoryA.createProduct();
productA.show();
Factory factoryB = new ConcreteFactoryB();
Product productB = factoryB.createProduct();
productB.show();
}
}
3.3 優(yōu)點(diǎn)和缺點(diǎn)
工廠方法模式的優(yōu)點(diǎn)是可以將客戶端和具體產(chǎn)品解耦,每個(gè)具體工廠類只負(fù)責(zé)創(chuàng)建特定的產(chǎn)品對(duì)象,從而使系統(tǒng)更加靈活、可擴(kuò)展和易于維護(hù)。工廠方法模式遵循了開閉原則,當(dāng)需要新增產(chǎn)品時(shí),只需要添加相應(yīng)的具體產(chǎn)品類和具體工廠類即可,而不需要修改抽象工廠類和客戶端代碼。
工廠方法模式的缺點(diǎn)是如果需要?jiǎng)?chuàng)建的產(chǎn)品對(duì)象比較多,就需要?jiǎng)?chuàng)建相應(yīng)的具體工廠類,這會(huì)導(dǎo)致系統(tǒng)中類的個(gè)數(shù)增加,增加了系統(tǒng)的復(fù)雜度。另外,由于每個(gè)具體工廠類只能創(chuàng)建特定的產(chǎn)品對(duì)象,如果需要?jiǎng)?chuàng)建的產(chǎn)品對(duì)象較為復(fù)雜,可能需要?jiǎng)?chuàng)建多個(gè)具體工廠類來創(chuàng)建這些產(chǎn)品對(duì)象,這會(huì)導(dǎo)致代碼的重復(fù)和冗余。
四、抽象工廠
4.1 什么是抽象工廠
抽象工廠模式是一種創(chuàng)建對(duì)象的工廠模式,它可以創(chuàng)建一組相關(guān)或相互依賴的對(duì)象,而無需指定它們的具體類。在抽象工廠模式中,有一個(gè)抽象工廠類,它定義了一些方法用于創(chuàng)建一組產(chǎn)品對(duì)象,每個(gè)方法對(duì)應(yīng)一種產(chǎn)品。具體工廠類實(shí)現(xiàn)了這些方法,用于創(chuàng)建具體的產(chǎn)品對(duì)象。
抽象工廠模式通常包括四個(gè)角色:抽象產(chǎn)品類、具體產(chǎn)品類、抽象工廠類和具體工廠類。
4.2 示例代碼
//抽象產(chǎn)品類1
interface Product1 {
void show();
}
//具體產(chǎn)品類1A
class ConcreteProduct1A implements Product1 {
public void show() {
System.out.println("This is product 1A");
}
}
//具體產(chǎn)品類1B
class ConcreteProduct1B implements Product1 {
public void show() {
System.out.println("This is product 1B");
}
}
//抽象產(chǎn)品類2
interface Product2 {
void show();
}
//具體產(chǎn)品類2A
class ConcreteProduct2A implements Product2 {
public void show() {
System.out.println("This is product 2A");
}
}
//具體產(chǎn)品類2B
class ConcreteProduct2B implements Product2 {
public void show() {
System.out.println("This is product 2B");
}
}
//抽象工廠類
interface Factory {
Product1 createProduct1();
Product2 createProduct2();
}
//具體工廠類A
class ConcreteFactoryA implements Factory {
public Product1 createProduct1() {
return new ConcreteProduct1A();
}
public Product2 createProduct2() {
return new ConcreteProduct2A();
}
}
//具體工廠類B
class ConcreteFactoryB implements Factory {
public Product1 createProduct1() {
return new ConcreteProduct1B();
}
public Product2 createProduct2() {
return new ConcreteProduct2B();
}
}
//客戶端
public class Client {
public static void main(String[] args) {
Factory factoryA = new ConcreteFactoryA();
Product1 product1A = factoryA.createProduct1();
Product2 product2A = factoryA.createProduct2();
product1A.show();
product2A.show();
Factory factoryB = new ConcreteFactoryB();
Product1 product1B = factoryB.createProduct1();
Product2 product2B = factoryB.createProduct2();
product1B.show();
product2B.show();
}
}4.3 優(yōu)點(diǎn)和缺點(diǎn)
抽象工廠模式的優(yōu)點(diǎn)是它可以創(chuàng)建一組相關(guān)或相互依賴的對(duì)象,而無需指定它們的具體類,從而使系統(tǒng)更加靈活、可擴(kuò)展和易于維護(hù)。抽象工廠模式遵循了開閉原則,當(dāng)需要新增產(chǎn)品時(shí),只需要添加相應(yīng)的抽象產(chǎn)品類、具體產(chǎn)品類和具體工廠類即可,不需要修改已有代碼,這樣可以減少系統(tǒng)的維護(hù)成本和風(fēng)險(xiǎn)。
抽象工廠模式還可以實(shí)現(xiàn)產(chǎn)品族的概念,即一組位于不同產(chǎn)品等級(jí)結(jié)構(gòu)中、功能相關(guān)聯(lián)的產(chǎn)品組成的家族,例如不同品牌的汽車,它們都有輪胎、發(fā)動(dòng)機(jī)、座椅等共同特點(diǎn),但具體實(shí)現(xiàn)各不相同。使用抽象工廠模式可以將不同品牌的汽車組成一個(gè)產(chǎn)品族,實(shí)現(xiàn)同一功能的產(chǎn)品可以進(jìn)行互換。
抽象工廠模式的缺點(diǎn)是抽象工廠類需要定義一組方法用于創(chuàng)建產(chǎn)品對(duì)象,增加新產(chǎn)品對(duì)象時(shí),需要修改抽象工廠類及其所有的具體工廠類,這將導(dǎo)致系統(tǒng)的維護(hù)復(fù)雜度增加。抽象工廠模式將一組相關(guān)的產(chǎn)品對(duì)象集合在一起創(chuàng)建,當(dāng)產(chǎn)品族中的產(chǎn)品等級(jí)結(jié)構(gòu)發(fā)生變化時(shí),將會(huì)影響到整個(gè)系統(tǒng),需要重構(gòu)整個(gè)工廠。
4.4 使用工廠模式的例子
一個(gè)常見的使用抽象工廠模式的例子是操作系統(tǒng)的界面風(fēng)格,例如Windows系統(tǒng)有Aero和Classic兩種界面風(fēng)格,而Mac OS有Aqua和Metal兩種界面風(fēng)格。每種界面風(fēng)格都有自己的按鈕、文本框、滾動(dòng)條等組件,因此可以將每種界面風(fēng)格看作一個(gè)產(chǎn)品族,而每個(gè)組件則看作產(chǎn)品等級(jí)結(jié)構(gòu)中的一個(gè)產(chǎn)品。使用抽象工廠模式可以將不同界面風(fēng)格的組件組成一個(gè)產(chǎn)品族,實(shí)現(xiàn)同一功能的組件可以進(jìn)行互換。例如,用戶可以選擇使用Aero風(fēng)格的按鈕和Metal風(fēng)格的文本框,而系統(tǒng)仍然能夠正常工作。
另一個(gè)使用抽象工廠模式的例子是游戲中的角色創(chuàng)建,例如一個(gè)RPG游戲中有魔法師、戰(zhàn)士和弓箭手三種角色,而每種角色又可以選擇不同的裝備,例如不同的武器、防具和飾品??梢詫⒚糠N角色看作一個(gè)產(chǎn)品族,而每個(gè)裝備則看作產(chǎn)品等級(jí)結(jié)構(gòu)中的一個(gè)產(chǎn)品。使用抽象工廠模式可以將不同角色的裝備組成一個(gè)產(chǎn)品族,實(shí)現(xiàn)同一功能的裝備可以進(jìn)行互換。例如,魔法師可以選擇使用火屬性的魔杖和光屬性的魔法書,而戰(zhàn)士可以選擇使用鐵劍和鋼盾,而系統(tǒng)仍然能夠正常工作。
到此這篇關(guān)于深入剖析Java工廠模式讓你的代碼更靈活的文章就介紹到這了,更多相關(guān)Java工廠模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java發(fā)送heartbeat心跳包(byte轉(zhuǎn)16進(jìn)制)
這篇文章主要介紹了java發(fā)送heartbeat心跳包(byte轉(zhuǎn)16進(jìn)制),需要的朋友可以參考下2014-05-05
Spring?MVC和springboot靜態(tài)資源處理問題
這篇文章主要介紹了Spring?MVC和springboot靜態(tài)資源處理問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
基于SpringBoot實(shí)現(xiàn)QQ郵箱驗(yàn)證碼注冊(cè)功能
QQ 郵箱是由騰訊公司推出的一款免費(fèi)郵箱服務(wù),它提供了完整的郵件發(fā)送和接收功能,并且還支持多種郵件格式和附件類型,QQ 郵箱還具有強(qiáng)大的反垃圾郵件功能,可以有效地過濾垃圾郵件,并保護(hù)用戶隱私和安全,所以本文給大家介紹了基于SpringBoot實(shí)現(xiàn)QQ郵箱驗(yàn)證碼注冊(cè)功能2024-11-11
MybatisPlus多表連接查詢的具體實(shí)現(xiàn)
MyBatis Plus是一款針對(duì)MyBatis框架的增強(qiáng)工具, 它提供了很多方便的方法來實(shí)現(xiàn)多表聯(lián)查,本文主要介紹了MybatisPlus多表連接查詢的具體實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10

