使用工廠方法模式設計最佳實踐

在前面的“設計模式”示例中,我們解釋了當今常用的“工廠”模式。 在本節中,我們將了解具有更多抽象的更高級的解決方案。 該模式稱為工廠方法設計模式。

定義:
Factory方法模式提供了一種用于創建對象的方法,但是將對象創建委托給了子類。 工廠方法設計模式以類似于工廠模式的方式解決了這些問題,并附加了抽象級別。

可以使用new關鍵字實例化該對象。 例如,對象A使用以下方法創建另一個對象B:

ClassB objB = new ClassB();

因此,對象A擁有對對象B的引用。

對象實例化對象實例化

由于如果后來修改了對象A,則對象A現在依賴于對象B,那么我們將不得不重新編譯對象A。 對象的創建可能會更加復雜,如果存在更多的耦合,那么維護將是軟件開發中一項痛苦而昂貴的工作。

為了避免這種最壞的情況,我們提供了新穎的設計模式來進行救援。 他們試圖在客戶端和對象創建者之間創建松散的耦合,并為開發人員提供其他一些設計優勢。 工廠方法模式就是解決設計問題的一種模式。

常用:
工廠方法設計模式通常與裝飾器設計模式一起用于各種框架(例如Struts,Spring,Apache)中。 有許多基于此Factory模式的J2EE模式,例如DAO模式。

讓我們以服裝工廠為例,我們正在創建各種類型的服裝,但是客戶完全不知道這些產品是如何創建的。 即使我們必須添加新的服裝類型(例如夾克),也無需更改客戶端代碼,從而增加了應用程序的靈活性。

工廠模式類圖

何時使用工廠方法模式?

  • 對象的創建需要代碼的重用,而無需大量重復代碼。
  • 一個類將不知道需要創建哪些子類。
  • 子類可以指定應創建的對象。
  • 父類會將對象的創建委托給其子類。

結構體

下圖突出顯示了工廠方法設計模式的典型結構。 與上述示例不同,已添加了一個附加的Factory Abstract(Factory)類。

工廠方法設計模式(UML)

在上圖中,以下是參與者:

  • 產品:這為工廠方法創建的對象定義了一個接口。
  • 具體產品:實現產品接口。
  • 工廠(創建者):這是一個抽象類,定義了返回產品對象的工廠方法。
  • 具體工廠:此類實現并覆蓋由父工廠類聲明的方法。

客戶(例如,對象類A)將要使用由ConcreteFactory類(對象類B)創建的產品。 但是,在這種情況下,客戶端僅持有對接口B的引用,而不是對象“類B”,因此它不需要了解有關類B的任何信息。 實際上,可以有多個類可以實現抽象類。

Factory Method模式允許子類決定實例化哪個類的含義是什么?
從根本上講,這意味著對工廠抽象類進行編碼,而無需知道將實例化哪些實際的ConcreteProduct類,即它是Trouser還是Shirt。 這完全由ConcreteFactory類確定。

現在,將上述模式實現到我們的GarmentFactory示例中。

工廠方法示例

讓我們開始吧。 我們不會重復在Factory Pattern文章中找到的具體產品的代碼,例如Shirt.java和Trouser.java。

已創建一個面向客戶的新Factory抽象類。

public abstract class Factory {protected abstract GarmentType createGarments(String selection);}

需要修改GarmentFactory類以繼承抽象類Factory。

public class GarmentFactory extends Factory{public GarmentType createGarments(String selection) {if (selection.equalsIgnoreCase('Trouser')) {return new Trouser();} else if (selection.equalsIgnoreCase('Shirt')) {return new Shirt();}throw new IllegalArgumentException('Selection doesnot exist');}
}

客戶端類引用Factory類,并對Factory的createGarments(selection)方法進行分類以在運行時創建產品。

Factory factory = new GarmentFactory();
GarmentType objGarmentType = factory.createGarments(selection);
System.out.println(objGarmentType.print());


優點:

  • 通過將對象創建從客戶端代碼移到Factory類及其子類,代碼可以靈活,松耦合和可重用。 由于異議創建是集中的,因此維護此類代碼更加容易。
  • 客戶代碼僅處理產品接口,因此無需修改客戶代碼邏輯即可添加任何具體產品。
  • Factory Method的優點是它可以多次返回相同的實例,或者可以返回子類而不是該確切類型的對象。
  • 它通過在工廠中創建對象來鼓勵代碼的一致性,該工廠強制執行每個人都必須遵循的一組明確的規則。 這樣可以避免在不同的客戶端使用不同的構造函數。


例:

JDBC是這種模式的一個很好的例子。 應用程序代碼不需要知道將與哪個數據庫一起使用,因此不需要知道應使用哪些特定于數據庫的驅動程序類。 相反,它使用工廠方法來獲取連接,語句和其他可使用的對象。 這提供了更改后端數據庫的靈活性,而無需更改您的DAO層。
以下是SDK中的一些示例:
valueOf()方法,返回由工廠創建的對象,該對象與傳遞的參數值相等。 getInstance()方法,該方法創建Singleton類的實例。 newInstance()方法,該方法用于每次調用時從工廠方法創建和返回新實例。 下載示例代碼

參考: Idiotechie博客上來自JCG合作伙伴 Mainak Goswami的使用Factory Method Pattern設計最佳實踐 。

翻譯自: https://www.javacodegeeks.com/2012/10/design-best-practices-using-factory-method-pattern.html

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

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

相關文章

偏導數

引入 一元函數導數: 在一元函數中,我們已經知道導數就是函數的變化率(對于一個一元函數,x增大了多少,y增大了多少,這個就是變化率)。對于二元函數我們同樣要研究它的“變化率”。在xOy平面內&am…

qt繪制一圈圓_Qt繪制圓

最近開始折騰Qt了,手頭上的一個項目需要用到Qt來繪制一些簡單圖像。記錄下Qt繪制圓的過程:對于以A為圓心,半徑為R的圓,外部有一個外切的正方形,正方形上有B點。如下圖所示:對于void QPainter::drawArc(int …

前端基礎之HTML

HTML介紹 Web服務本質 import socketsk socket.socket()sk.bind(("127.0.0.1", 8080)) sk.listen(5)while True:conn, addr sk.accept()data conn.recv(8096)conn.send(b"HTTP/1.1 200 OK\r\n\r\n")conn.secd(b"<h1>Hello world!</h1&g…

指令引用了 內存 該內存不能為read 一直彈窗_【翻譯】使用Rust測試ARM和X86內存模型

原文標題: The Story of Tail Call Optimizations in Rust 原文標題: Examining ARM vs X86 Memory Models with Rust原文鏈接: https://www.nickwilcox.com/blog/arm_vs_x86_memory_model/公眾號&#xff1a; Rust碎碎念蘋果公司最近宣布&#xff0c;他們將要把筆記本和桌面電…

Docker應用二:docker常用命令介紹

Docker常用命令使用介紹 docker中常用的命令: 1、docker search image_name:搜查鏡像 2、docker pull image_name:從鏡像庫中拉去鏡像 3、docker run image_name:運行容器 --restartalways:容器退出后重新啟動 --name:自定容器名字 --d:后臺運行容器 --i:交互模式 --t:打開一個…

關于Ubuntu使用筆記

Ubuntu vm tools 安裝 sudo apt install open-vm-tools-desktop 在安裝程序時Ubuntu會將安裝目錄鎖定&#xff0c;安裝結束后會解除鎖定&#xff0c;中斷安裝后無法再安裝其他軟件解決方案 E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavail…

具有可執行Tomcat的獨立Web應用程序

在部署應用程序時&#xff0c;簡單性是最大的優勢。 您將了解到&#xff0c;尤其是在項目發展且需要在環境中進行某些更改時。 將整個應用程序打包到一個獨立且自足的JAR中似乎是個好主意&#xff0c;尤其是與在目標環境中安裝和升級Tomcat相比。 過去&#xff0c;我通常將Tomc…

css網頁中設置背景圖片的方法詳解

在css代碼中設置背景圖片的方法&#xff0c;包括背景圖片、背景重復、背景固定、背景定位等 用css設置網頁中的背景圖片&#xff0c;主要有如下幾個屬性&#xff1a; 1&#xff0c;背景顏色 {">說明&#xff1a;參數取值和顏色屬性一樣 注意&#xff1a;在HTML當中&am…

node-sass安裝不成功的問題

SASS_BINARY_SITEhttps://npm.taobao.org/mirrors/node-sass/ npm install node-sass 簡單粗暴的執行上述的命令。轉載于:https://www.cnblogs.com/czaiz/p/6918114.html

npm升級依賴包_Taro跨端開發之依賴管理

昨天跑的好好項目,今天跑不起來我們在開發周期比較長的前端項目的時候,必然會遇到依賴管理的問題. 我們在開發項目的時候,我們用了大量的三方庫.這些三方的依賴庫時不時的會更新自己的代碼.第三方依賴庫的代碼更新會很容易造成代碼運行的不穩定, 比如昨天還跑的好好的項目,另一…

QOTD:Java線程與Java堆空間

以下問題很常見&#xff0c;并且與OutOfMemoryError有關&#xff1a;在JVM線程創建過程和JVM線程容量期間無法創建新的本機線程問題。 這也是我向新技術候選人&#xff08;高級職位&#xff09;提出的典型面試問題。 我建議您在查看答案之前嘗試提供自己的答復。 題&#xff1…

sql查詢重復項

select * from [表A] where id in (select id from [表A] group by id having count(id) >1 )轉載于:https://www.cnblogs.com/wuyujie/p/7885017.html

java util logging_簡單日志記錄,使用java.util.logging

jspservletJavaBean模式下,可以做個簡單的日志記錄,日志文件保存在服務器.(Tomcat)package controller;import java.io.File;import java.io.IOException;import java.util.logging.FileHandler;import java.util.logging.Level;import java.util.logging.Logger;import javax.…

超級高鐵

超級高鐵 作者&#xff1a;武培&#xff0c;高培焱 作品來源&#xff1a;實踐 美國電動汽車公司特斯拉和美國科技公司ET3都公布了“真空管鋼運輸”計劃&#xff0c;特斯拉將其命名為“超級高鐵”&#xff0c;ET3因列車外觀酷似膠囊因而稱之為“吃膠囊”列車。根據ET3公司的介紹…

使用Spring @Autowired List的責任鏈

在Spring 3.1中&#xff0c;有一種方法可以自動填充類型化的List&#xff0c;這在您想在代碼中稍微進行去耦和清理時非常方便。 為了向您展示它是如何工作的&#xff0c;我將實現一個簡單的責任鏈&#xff0c;該責任鏈將為通過的用戶打印一些問候。 讓我們從我們擁有的&#…

設計模式 建造者模式 與 Spring Bean建造者 BeanDefinitionBuilder 源碼與應用

建造者模式 定義: 將一個復雜對象的構建與它的表示分離&#xff0c;使得同樣的構建過程可以創建不同的表示主要作用: 在用戶不知道對象的建造過程和細節的情況下就可以直接創建復雜的對象如何使用: 用戶只需要給出指定復雜對象的類型和內容, 建造者模式負責按順序創建復雜對象…

java 布隆過濾器_什么是布隆過濾器(Bloom Filter)?

在日常工作中&#xff0c;有一個比較常見的需求&#xff0c;就是需要判斷一個元素是否在集合中。例如以下場景&#xff1a;給定一個IP黑名單庫&#xff0c;檢查指定IP是否在黑名單中&#xff1f;在接收郵件的時候&#xff0c;判斷一個郵箱地址是否為垃圾郵件&#xff1f;在文字…

STM32上使用JSON

一、STM32工程中添加JSON 最近在一網2串項目&#xff0c;串口和網口之間可能需要定義一下簡單的通信協議&#xff0c;而通信協議上則需要去定義一下通信的數據格式&#xff0c;上次聽劍鋒說要用Json來定義&#xff0c;目前查了下資料具體如何去應用還不 會。因為最新的KEIL上支…

Flex 學習

Flex案例一&#xff1a; 1 <html>2 <head>3 <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /> 4 <title>無標題</title>5 <style type"text/css">6 body,h1,h2,h3,h4,…

Cocos2d-X中實現自己定義菜單處理事件

當用戶點擊再松開后才會響應菜單事件&#xff0c;而在游戲中有些游戲須要玩家點擊后就處理事件。如玩坦克大戰的時候&#xff0c;玩家是點擊一下就發射子彈。并是點擊松手后發射子彈&#xff0c;在Cocos2d-X中沒有這樣的消息。以下就通過自己定義的方式實現當用戶點擊后就調用處…