抽象工廠設計模式解釋

抽象工廠設計模式是工廠設計模式的另一種形式。 這種模式可以被視為“超級工廠”或“工廠工廠”。

抽象工廠設計模式(屬于“四人幫”的一部分)屬于“創新設計模式”類別,它提供了一種封裝一組具有公共鏈接的工廠的方法,而無需突出其具體類。 這就是工廠根據用戶需求在運行時創建各種對象的全部內容。 客戶仍然完全不知道(解耦)了從各個工廠獲得的具體產品,客戶只能訪問簡化的界面。

定義:
抽象工廠設計模式提供了一個接口,用于創建相關或相關對象的族,而無需指定其具體類。

問題陳述:

我們將考慮與服裝工廠相同的先前示例,并對其進行擴展以理解抽象工廠的問題陳述。 考慮一家專門生產褲子和襯衫的服裝工廠。 現在,作為著名零售品牌的母公司正進入小工具領域。 他們還計劃擴大其工廠,在美國建立一個中心,在英國建立另一個中心。 客戶端應該完全不知道對象是如何創建的。 我們可以用來解決此要求的最佳設計模式是什么?

解:

為了解決上述設計問題,我們將使用抽象工廠模式。 如前所述,這是超級工廠。 使用工廠方法模式無法有效解決上述問題,因為這涉及與母公司或受撫養人相關的多個工廠和產品。
注意:在設計模式中,摘要和接口可以使用相同的名稱來引用。

結構體:

抽象工廠設計模式

在上圖中,創建的其他項是通過AbstractFactory的具有createProductA()createProductB()方法的抽象附加層。 有多個ConcreteFactories可以實現AbstractFactory的方法。 客戶端現在僅訪問AbstractFactory接口。

另一部分是產品。 客戶端現在訪問不同的AbstractProduct接口AbstractProductAAbstractProductB 。 所有用于AbstractProducts的ConcreteProducts都是由ConcreteFactories( ConcreteFactory1ConcreteFactory2 )創建的,這是邏輯。

現在,讓我們看一下我們現實生活中的GarmentFactory示例,它與Factory Method模式有什么區別。

抽象工廠示例

在上面的現實示例中,RetailFactory是AbstractFactory類,該類現在在美國和英國等不同位置擁有多個Concrete工廠(UKFactory和USFactory),專門致力于分別創建襯衫/筆記本電腦和褲子/手機等多種產品。 在此示例中,我們還創建了另一個名為FactoryMaker的其他類,該類從客戶端中選擇Factory,然后將作業相應地委派給適當的Factory類。 客戶端完全不知道該處理的完成方式,并且僅引用RetailFactory接口以及GarmentType和GadgetType接口。 這種松散的耦合也有助于增加多個混凝土產品,而無需更改客戶代碼。

優點:

使用此模式,即使在運行時也可以在不更改客戶端代碼的情況下交換具體類。

退稅:

主要缺點之一是額外的復雜性和在初始階段編寫代碼。

你知道嗎?
JEE中的數據訪問對象使用(GoF)抽象工廠模式從RdbDAOFactory,XmlDAOFactory,OdbDAOFactory創建各種產品DAO。


有趣的一點:

  • 抽象工廠,構建器和原型可以在其實現中使用Singleton。 抽象工廠模式通常與工廠方法一起使用,但是也可以使用原型模式來實現,以提高性能并簡化代碼。
  • 抽象工廠可以用作Fa?ade模式的替代方案,以隱藏平臺特定的類
  • AbstractFactory類僅聲明用于創建產品的接口。 實際的創建是ConcreteProduct類的任務,其中一個好的方法是為該系列的每個產品應用Factory Method設計模式。

抽象工廠和工廠方法模式之間的區別:

  • Factory Method模式向客戶端公開了一種用于創建對象的方法,而在Abstract Factory的情況下,它們公開了可能由這些Factory方法組成的一系列相關對象。
  • 設計始于使用工廠方法(復雜程度較低,更易于自定義的子類激增),并隨著設計人員發現需要更多靈活性的地方而向抽象工廠,原型或生成器(更靈活,更復雜)發展。
  • 工廠方法模式隱藏單個對象的構造,而抽象工廠方法則隱藏一系列相關對象的構造。 抽象工廠通常使用一組工廠方法來實現。


參考: 抽象工廠設計模式在Idiotechie博客上由我們的JCG合作伙伴 Mainak Goswami 解釋 。

翻譯自: https://www.javacodegeeks.com/2012/10/abstract-factory-design-pattern-explained.html

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

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

相關文章

app賬號退不出去_最新!多交的稅可以退,同學,你今天退稅了嗎?

4.3 號 更新。1、有知友留言,已經收到退稅了。2、部分地區陸續開放申報了,建議大家不要著急。3、大家耐心一點,該是你的就是你的,退稅這個事多退少補,建議大家在白天上班時間去APP上看看,畢竟相關公務人員也…

【BZOJ2004】[Hnoi2010]Bus 公交線路 狀壓+矩陣乘法

【BZOJ2004】[Hnoi2010]Bus 公交線路 Description 小Z所在的城市有N個公交車站,排列在一條長(N-1)km的直線上,從左到右依次編號為1到N,相鄰公交車站間的距離均為1km。 作為公交車線路的規劃者,小Z調查了市民的需求,決定…

課時77.序選擇器(掌握)

CSS3中新增的選擇器最具代表性的就是序選擇器。 1.同級別的第幾個 1. :first-child 選中同級別中的第一個標簽 注意點:不區分類型 但是我們這里有一個注意點,如果我們在第一個p之前加一個h1,則第一個p就不變紅了,因為我們…

Gulp——文件壓縮和文件指紋

先看下文件指紋添加成功發布后的“成果”。 首先介紹下gulp的文件壓縮(壓縮css和js) (下面介紹的代碼移步這里) 我的文件目錄如下: (標紅部分是生成的處理后的文件) 如何使用gulp,請…

java afconsole_Java ——基礎語法

package myhello; //本類所在的包的路徑import af.util.AfMath;//導入對應的類import java.util.Random;//導入隨機數的類public classHelloWorld{public static voidmain(String[] args){int a 8;inti;int total 0;int score 80;System.out.println(a > 8);//空語句 只有…

Java 7:使用NIO.2進行文件過濾-第2部分

大家好。 這是使用NIO.2系列進行文件過濾的第2部分。 對于那些尚未閱讀第1部分的人 ,這里有個回顧。 NIO.2是自Java 7起JDK中包含的用于I / O操作的新API。使用此新API,您可以執行與java.io相同的操作,以及許多出色的功能,例如&a…

js for 循環 添加tr td 算法

StringBuffer sbnew StringBuffer(); int n 5; sb.append("<tr>"); List<MenuBean> chs mb.getChildren(); for(int j 0; chs ! null && j < chs.size(); j){ MenuBean _mb2 chs.get(j); if (i % n 0)//被n整除&#xff0c;即有了n列之后…

1034. 二哥的金鏈

Description 一個陽光明媚的周末&#xff0c;二哥出去游山玩水&#xff0c;然而粗心的二哥在路上把錢包弄丟了。傍晚時分二哥來到了一家小旅店&#xff0c;他翻便全身的口袋也沒翻著多少錢&#xff0c;而他身上唯一值錢的就是一條漂亮的金鏈。這條金鏈散發著奇異的光澤&#xf…

課時76.兄弟選擇器(掌握)

我們先來明確一點&#xff0c;什么是兄弟&#xff1f; 比如&#xff0c;head和body是兄弟&#xff0c;必須是同級關系&#xff0c;如果是嵌套關系&#xff0c;兒子&#xff0c;孫子則不可以。 1.相鄰兄弟選擇器 CSS2 作用&#xff1a;給指定選擇器后面緊跟的那個選擇器選中的…

java中不能定義為變量名稱_Java,“變量名”不能解析為變量

我使用Java使用Eclipse&#xff0c;出現此錯誤&#xff1a;"Variable name" cannot be resolved to a variable.使用此Java程序&#xff1a;public class SalCal {private int hoursWorked;public SalCal(String name, int hours, double hoursRate) {nameEmployee …

24v開關電源維修技巧_康佳LED液晶彩電KPS+L1900C301電源板原理與維修

康佳液晶彩電采用的KPSL1900C3-01型電源板&#xff0c;編號為34007728&#xff0c;版本號為35015686集成電路采用FAN7530FSGM300FSFR1700組合方案&#xff0c;輸出5.1VSB/4A、24V/4A、12V/4A電壓。應用于康佳LED47IS988PD、LED42M11PD、LED46MS92DC、LED42IS988PDE、LED42X5000…

zookeeper集群 新手安裝指南

Zookeeper集群的角色&#xff1a; Leader 和 follower &#xff08;Observer&#xff09;zk集群最好配成奇數個節點只要集群中有半數以上節點存活&#xff0c;集群就能提供服務本事例采用版本:zookeeper-3.4.5 虛擬機:zk1 zk2 zk3/****************************************…

Google Guava并發– ListenableFuture

在上一篇文章中&#xff0c;我介紹了使用番石榴庫中com.google.common.util.concurrent包中的Monitor類。 在本文中&#xff0c;我將繼續介紹Guava并發實用程序&#xff0c;并討論ListenableFuture接口。 ListenableFuture通過添加接受完成偵聽器的方法&#xff0c;從java.util…

課時71.后代選擇器(掌握)

1.什么是后代選擇器&#xff1f; 作用&#xff1a;找到指定標簽的所有后代標簽&#xff0c;設置屬性。 首先你要明確什么是后代&#xff1f; 你的兒子&#xff0c;孫子&#xff0c;重孫子等&#xff0c;只要有你的血脈的&#xff0c;都是你的后代。 我們先來舉個例子 我們想…

java小球碰撞界面設計_JavaScript實現小球碰撞特效

JavaScript實現小球碰撞特效。類似自由落體運動。實現原理非常簡單&#xff0c;就是動態的改變每個元素的坐標。使用radius屬性將圖片圓角化。使用left&#xff0c;top屬性動態的改變小球的位置。碰撞反彈球&#xff0c;當碰撞到容器的邊緣后&#xff0c;進行反彈&#xff0c;反…

es6常用基礎合集

es6常用基礎合集 在實際開發中&#xff0c;ES6已經非常普及了。掌握ES6的知識變成了一種必須。盡管我們在使用時仍然需要經過babel編譯。 ES6徹底改變了前端的編碼風格&#xff0c;可以說對于前端的影響非常巨大。值得高興的是&#xff0c;如果你熟悉ES5&#xff0c;學習ES6并不…

java接口開發_如果你想學好Java,這些你需要了解

01基本知識  在學習Java之前&#xff0c;您需要了解計算機的基本知識&#xff0c;然后再學習Java。同時&#xff0c;您需要熟悉DOS命令、Java概述、JDK環境安裝配置、環境變量配置。JDK和環境變量配置完成后&#xff0c;就可以編寫Java程序了。02編程格式  此時&#xff0c…

從Java程序生成QR碼圖像

如果您精通技術和小工具&#xff0c;則必須了解QR碼。 這些天&#xff0c;到處都可以找到它-在博客&#xff0c;網站&#xff0c;甚至在某些公共場所。 這在移動應用程序中非常流行&#xff0c;在移動應用程序中&#xff0c;您可以使用QR Code掃描儀應用程序掃描QR Code&#x…

LintCode-最長公共子串

給出兩個字符串&#xff0c;找到最長公共子串。并返回其長度。 您在真實的面試中是否遇到過這個題&#xff1f; Yes例子 給出A“ABCD”&#xff0c;B“CBCE”&#xff0c;返回 2 注意 子串的字符應該連續的出如今原字符串中&#xff0c;這與子序列有所不同。標簽 Expand 相關…

課時67.標簽選擇器(掌握)

通過上節課的學習我們明白了如何通過十六進制來表示顏色 例如&#xff1a;紅色的幾種表示方法 我們發現在學習CSS當中的一些屬性的時候&#xff0c;它都有一些套路 只要知道屬性的名稱&#xff0c;屬性有什么作用&#xff0c;它有哪些取值&#xff0c;這個屬性有什么注意點 …