日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

手撕设计模式之「工厂方法模式」(Java描述)

發(fā)布時(shí)間:2025/3/20 java 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 手撕设计模式之「工厂方法模式」(Java描述) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

工廠方法模式是對(duì)簡(jiǎn)單工廠模式的改進(jìn),它通過(guò)對(duì)工廠類進(jìn)行抽象形成一個(gè)抽象工廠接口,再讓具體的工廠負(fù)責(zé)對(duì)應(yīng)產(chǎn)品的創(chuàng)建,使得在增加產(chǎn)品的場(chǎng)景中也滿足“開閉原則”。希望通過(guò)本文的學(xué)習(xí),你可以掌握這種設(shè)計(jì)模式。

為了方便學(xué)習(xí)和交流,我會(huì)把「手撕設(shè)計(jì)模式」系列的代碼上傳到Github,需要的小伙伴可以到上面下載(記得順手star一下哦~)。

GitHub地址:https://github.com/VeggieOrz/DesignPattern

文章目錄

  • 前言
  • 1. 模式動(dòng)機(jī)
  • 2. 模式定義
  • 3. 模式結(jié)構(gòu)
  • 4. 模式實(shí)現(xiàn)
  • 5. 模式總結(jié)
    • 5.1 優(yōu)點(diǎn)
    • 5.2 缺點(diǎn)
    • 5.3 應(yīng)用場(chǎng)景
  • 參考資料

1. 模式動(dòng)機(jī)

從上一篇博文「簡(jiǎn)單工廠模式」中,我們了解到它在增添新產(chǎn)品時(shí)必須修改工程類,不滿足“開閉原則”。為了在簡(jiǎn)單工廠模式的基礎(chǔ)上提高工廠類的拓展性,我們就引入了簡(jiǎn)單工廠模式,它的工廠類多了一層抽象工廠,具體產(chǎn)品對(duì)象的創(chuàng)建由和與之對(duì)應(yīng)的具體工廠來(lái)負(fù)責(zé)

工廠方法模式降低了單個(gè)工廠的職責(zé),每次新增產(chǎn)品時(shí),只要加入新的具體產(chǎn)品類和具體工程類即可,符合開閉原則。(可以結(jié)合下圖理解)

2. 模式定義

工廠方法模式(Factory Method Pattern)簡(jiǎn)稱工廠模式,屬于類創(chuàng)建模式。在工廠方法模式中,工廠父類負(fù)責(zé)定義創(chuàng)建產(chǎn)品對(duì)象的公共接口,而工廠子類負(fù)責(zé)生成具體的產(chǎn)品類對(duì)象,這樣做的目的是將產(chǎn)品類的實(shí)例化操作延遲到工廠子類中完成,即通過(guò)工廠子類來(lái)確定究竟應(yīng)該實(shí)例化哪一個(gè)具體產(chǎn)品類。

3. 模式結(jié)構(gòu)

工廠方法模式的結(jié)構(gòu)圖如下:

其中包含四個(gè)角色:

  • Product(抽象產(chǎn)品):抽象產(chǎn)品時(shí)定義產(chǎn)品的接口,是工廠方法模式所創(chuàng)建的超類,也是所有具體產(chǎn)品類的共同父類或接口。
  • ConcreteProduct(具體產(chǎn)品角色):具體產(chǎn)品實(shí)現(xiàn)了抽象產(chǎn)品接口,某種類型的具體產(chǎn)品3由專門的工廠創(chuàng)建,它們之間一一對(duì)應(yīng)。
  • Factory(抽象工廠):這是工廠方法模式的核心,類中聲明了用于創(chuàng)建產(chǎn)品的factoryMethod(),任何在模式中創(chuàng)建對(duì)象的工廠都必須實(shí)現(xiàn)該接口。
  • ConcreteFactory(具體工廠):具體工廠是抽象工廠的子類,實(shí)現(xiàn)了抽象工廠中定義的factoryMethod()方法,負(fù)責(zé)具體產(chǎn)品的創(chuàng)建。

4. 模式實(shí)現(xiàn)

(1)抽象產(chǎn)品

public interface Product {public void use(); }

(2)具體產(chǎn)品

public class ConcreteProductA implements Product{public void use() {System.out.println("This is Product A.");} }

(3)抽象工廠

需要注意:工廠方法的返回類型必須是抽象產(chǎn)品類

public interface Factory {// 工廠方法factoryMethodpublic Product createProduct(); }

(4)具體工廠

public class ConcreteFactoryA implements Factory{public Product createProduct() {System.out.println("Product A is being produced.");return new ConcreteProductA();} }

(5)工具類 and 配置文件

工具類主要用來(lái)進(jìn)行配置文件的讀取,讀出想要?jiǎng)?chuàng)建的類型,然后通過(guò)Java提供的反射機(jī)制創(chuàng)建對(duì)應(yīng)的對(duì)象。

public class XMLUtil {// 讀取XML配置文件中具體類的類名,并返回一個(gè)實(shí)例對(duì)象public static Object getBean() throws Exception {try {// 創(chuàng)建文檔對(duì)象DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = dFactory.newDocumentBuilder();Document doc;doc = builder.parse(new File("./src/factoryMethod/config.xml"));// 獲取包含類名的文本節(jié)點(diǎn)NodeList nodeList = doc.getElementsByTagName("className");Node classNode = nodeList.item(0).getFirstChild();String className = classNode.getNodeValue();// 通過(guò)類名生成實(shí)例對(duì)象并將其返回Class<?> c = Class.forName(className);Object obj = c.newInstance();return obj;} catch (Exception e) {// 如果該類名找不到就拋出異常throw new Exception("Sorry,This kind of product is not found");}} }

寫配置文件時(shí)候,要注意類的路徑需要加上包名,否則會(huì)拋出java.lang.ClassNotFoundException異常。

<?xml version="1.0" encoding="UTF-8"?> <config><className>factoryMethod.factory.ConcreteFactoryA</className> </config>

(6)客戶端

public class Client {public static void main(String[] args) {try {Factory factory;Product product;// 先通過(guò)讀取配置文件和Java反射機(jī)制創(chuàng)建工廠factory = (Factory)XMLUtil.getBean();// 工廠負(fù)責(zé)創(chuàng)建相應(yīng)的產(chǎn)品product = factory.createProduct();product.use();} catch (Exception e) {System.out.println(e.getMessage());}} }

完成了這些只后,就知道了工廠方法模式的具體實(shí)現(xiàn),但是上面代碼還沒(méi)體現(xiàn)到這種設(shè)計(jì)模式的優(yōu)點(diǎn)。我們不妨思考一下,如果現(xiàn)在要挑添加一個(gè)ConcreteProductB,并將要?jiǎng)?chuàng)建的產(chǎn)品改為添加的這個(gè)產(chǎn)品,應(yīng)該如何操作呢?

  • 先新建一個(gè)實(shí)現(xiàn)Product接口的ConcreteProductB類;
  • 然后再新建一個(gè)實(shí)現(xiàn)了Factory接口的ConcreteFactoryB類,專門負(fù)責(zé)產(chǎn)品類ConcreteProductB的創(chuàng)建;
  • 最后再將配置文件修改為ConcreteFactoryB類的路徑即可。

由此可見(jiàn),工廠方法模式添加新產(chǎn)品時(shí)也不需要對(duì)模式中原有的代碼進(jìn)行修改!

5. 模式總結(jié)

5.1 優(yōu)點(diǎn)

  • 工廠方法用來(lái)創(chuàng)建客戶所需要的產(chǎn)品,同時(shí)還向客戶隱藏了哪種具體產(chǎn)品類將被實(shí)例化這一細(xì)節(jié)
  • 能夠讓工廠自主確定創(chuàng)建何種產(chǎn)品對(duì)象,而如何創(chuàng)建這個(gè)對(duì)象的細(xì)節(jié)則完全封裝在具體工廠內(nèi)部。
  • 拓展性好,在系統(tǒng)中加入新產(chǎn)品時(shí),不需要對(duì)已有代碼進(jìn)行修改,只要加上新的產(chǎn)品類和對(duì)應(yīng)工廠類即可,完全符合開閉原則。

5.2 缺點(diǎn)

  • 系統(tǒng)中類的個(gè)數(shù)將成對(duì)增加,在一定程度上增加了系統(tǒng)的復(fù)雜度,會(huì)給系統(tǒng)帶來(lái)一定的額外開銷。
  • 增加了系統(tǒng)的抽象性和理解難度。

5.3 應(yīng)用場(chǎng)景

  • 客戶端不知道它所需要的對(duì)象的類,客戶端不需要知道具體產(chǎn)品類的類名, 只需要知道所對(duì)應(yīng)的工廠即可,具體產(chǎn)品對(duì)象由具體工廠類創(chuàng)建。
  • 抽象工廠類通過(guò)其子類來(lái)指定創(chuàng)建哪個(gè)對(duì)象

參考資料

  • 《Java設(shè)計(jì)模式》
  • Factory Method | GitHub

  • 如果看完本文感覺(jué)有所收獲,別忘了點(diǎn)贊哦~

    總結(jié)

    以上是生活随笔為你收集整理的手撕设计模式之「工厂方法模式」(Java描述)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。