java設(shè)計(jì)模式【工廠方法模式】

工廠方法模式
工廠方法模式(FACTORY METHOD)是一種常用的類創(chuàng)建型設(shè)計(jì)模式,此模式的核心精神是封裝類中變化的部分,提取其中個(gè)性化善變的部分為獨(dú)立類,通過(guò)依賴注入以達(dá)到解耦、復(fù)用和方便后期維護(hù)拓展的目的。它的核心結(jié)構(gòu)有四個(gè)角色,分別是抽象工廠;具體工廠;抽象產(chǎn)品;具體產(chǎn)品。
抽象工廠角色負(fù)責(zé)定義產(chǎn)品的創(chuàng)建接口,即產(chǎn)品的創(chuàng)建過(guò)程應(yīng)當(dāng)被推遲到子類中實(shí)現(xiàn)。具體工廠角色則實(shí)現(xiàn)這些創(chuàng)建接口,并負(fù)責(zé)實(shí)際創(chuàng)建產(chǎn)品的工作。抽象產(chǎn)品角色是工廠方法模式的核心,它定義了一個(gè)產(chǎn)品的接口,但并不實(shí)現(xiàn)具體的產(chǎn)品邏輯。具體產(chǎn)品角色則實(shí)現(xiàn)這些接口并負(fù)責(zé)具體的產(chǎn)品邏輯。
使用工廠方法模式可以在不修改具體工廠角色的情況下引入新的產(chǎn)品,從而簡(jiǎn)化了系統(tǒng)的設(shè)計(jì),并提高了系統(tǒng)的可擴(kuò)展性。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
:
-
系統(tǒng)的可擴(kuò)展性非常好。因?yàn)樵谔砑有庐a(chǎn)品時(shí),只需要添加新的具體工廠和具體產(chǎn)品,而不需要修改現(xiàn)有系統(tǒng)的代碼。這樣就保證了系統(tǒng)的可擴(kuò)展性。
-
易于維護(hù)和管理。由于工廠方法模式將創(chuàng)建產(chǎn)品的邏輯推遲到子類中實(shí)現(xiàn),因此可以更容易地進(jìn)行維護(hù)和管理。子類可以在不改變父類接口的情況下添加新的特性,從而減少了系統(tǒng)的開銷。
-
提高了系統(tǒng)的可靠性。因?yàn)樵谔砑有庐a(chǎn)品時(shí),只需要修改具體工廠類,而不需要修改客戶端代碼。這樣可以減少因客戶端代碼變化而導(dǎo)致的系統(tǒng)崩潰的可能性。
缺點(diǎn)
:
-
增加了系統(tǒng)的復(fù)雜度。在實(shí)現(xiàn)工廠方法模式時(shí),需要引入抽象層,這樣就增加了系統(tǒng)的抽象性和理解難度,同時(shí)也增加了實(shí)現(xiàn)的難度。
-
需要更多的代碼編寫。使用工廠方法模式需要編寫新的具體工廠類和具體產(chǎn)品類,這樣就會(huì)增加代碼的復(fù)雜度和維護(hù)的難度。
使用場(chǎng)景
-
產(chǎn)品具有復(fù)雜的結(jié)構(gòu)和層次關(guān)系,需要在多個(gè)子類之間共享某些共性邏輯。使用工廠方法模式可以將這些共性邏輯提取出來(lái),作為一個(gè)獨(dú)立的類進(jìn)行封裝,從而簡(jiǎn)化代碼并提高系統(tǒng)的可擴(kuò)展性。
-
系統(tǒng)需要提供一些通用的功能,但是這些功能可能會(huì)在不同的產(chǎn)品中被重復(fù)使用。使用工廠方法模式可以將這些通用功能提取出來(lái),作為一個(gè)獨(dú)立的類進(jìn)行封裝,從而降低系統(tǒng)的開發(fā)成本。
-
系統(tǒng)中需要使用組件化的設(shè)計(jì)思想,將不同的組件封裝成獨(dú)立的類。使用工廠方法模式可以將這些組件的創(chuàng)建過(guò)程推遲到子類中實(shí)現(xiàn),從而簡(jiǎn)化代碼并提高系統(tǒng)的可維護(hù)性。
-
系統(tǒng)需要支持動(dòng)態(tài)添加和刪除產(chǎn)品。使用工廠方法模式可以在不修改客戶端代碼的情況下動(dòng)態(tài)添加和刪除產(chǎn)品,從而提高系統(tǒng)的靈活性和可擴(kuò)展性。
具體實(shí)現(xiàn)
以下以產(chǎn)品A,產(chǎn)品B為例實(shí)現(xiàn)工廠方法模式。

抽象工廠
抽象工廠定義產(chǎn)品的創(chuàng)建接口返回抽象產(chǎn)品
/**
* 抽象工廠類
*/
public interface IFactory {
/**
* 定義創(chuàng)建產(chǎn)品接口
*
* @return 抽象產(chǎn)品
*/
IProduct getInstance();
}
具體工廠
具體工廠繼承實(shí)現(xiàn)工廠實(shí)現(xiàn)創(chuàng)建產(chǎn)品接口返回具體的產(chǎn)品
產(chǎn)品A工廠類
/**
* @author physicx
* @date 2023/5/15 上午10:12
* @desc 產(chǎn)品A具體工廠類
* Created with IntelliJ IDEA
*/
public class ProductAFactory implements IFactory {
/**
* 返回具體產(chǎn)品
*
* @return 產(chǎn)品A
*/
@Override
public IProduct getInstance() {
return new ProductA();
}
}
產(chǎn)品B工廠類
/**
* @author physicx
* @date 2023/5/15 上午10:18
* @desc 產(chǎn)品B具體工廠
* Created with IntelliJ IDEA
*/
public class ProductBFactory implements IFactory {
/**
* 返回具體產(chǎn)品
*
* @return 產(chǎn)品B
*/
@Override
public IProduct getInstance() {
return new ProductB();
}
}
抽象產(chǎn)品
抽象產(chǎn)品接口定義產(chǎn)品的默認(rèn)方法和各產(chǎn)品實(shí)現(xiàn)有差異的方法
/**
* 抽象產(chǎn)品類
*/
public interface IProduct {
/**
* 產(chǎn)品公共方法
*/
default void publicMethod() {
System.out.println("公共方法");
}
/**
* 各個(gè)產(chǎn)品有差異方法,子類具體實(shí)現(xiàn)
*/
void printInfo();
}
具體產(chǎn)品
具體產(chǎn)品實(shí)現(xiàn)抽象產(chǎn)品,各個(gè)產(chǎn)品對(duì)方法做自己的具體實(shí)現(xiàn)
產(chǎn)品A
/**
* @author physicx
* @date 2023/5/15 上午10:13
* @desc 產(chǎn)品A
* Created with IntelliJ IDEA
*/
public class ProductA implements IProduct {
private final static String NAME = "產(chǎn)品A";
/**
* 輸出產(chǎn)品信息
*/
@Override
public void printInfo() {
System.out.println("產(chǎn)品名稱:" + NAME);
}
}
產(chǎn)品B
/**
* @author physicx
* @date 2023/5/15 上午10:17
* @desc 產(chǎn)品B
* Created with IntelliJ IDEA
*/
public class ProductB implements IProduct {
private final static String NAME = "產(chǎn)品B";
/**
* 輸出產(chǎn)品信息
*/
@Override
public void printInfo() {
System.out.println("產(chǎn)品名稱:" + NAME);
}
}
調(diào)用示例
public static void main(String[] args) {
//產(chǎn)品A工廠方法調(diào)用
IProduct productA = new ProductAFactory().getInstance();
productA.printInfo();
//產(chǎn)品工廠方法調(diào)用
IProduct productB = new ProductBFactory().getInstance();
productB.printInfo();
}
運(yùn)行結(jié)果如下:
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-447839.html
補(bǔ)充說(shuō)明
后續(xù)會(huì)依次更新 詳解java 23種設(shè)計(jì)模式,歡迎關(guān)注、交流、補(bǔ)充相關(guān)內(nèi)容(如下)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-447839.html
快捷導(dǎo)航 |
---|
設(shè)計(jì)模式簡(jiǎn)介總結(jié) |
單例模式詳解 |
工廠方法模式 |
抽象工廠模式 |
到了這里,關(guān)于java設(shè)計(jì)模式【工廠方法模式】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!