抽象工廠模式詳解(四)
一、定義
為建立一組相關或者相互依賴的物件提供一個介面,而且無須指定它們的具體類。
簡單的說,抽象工廠模式是工廠方法模式的升級版本,當存在多個產品族時,產品族之間是存在相關或者依賴關係,可以使用抽象工廠來建立產品。
二、例項分析
網上已經有很多關於寶馬的抽象工廠的例子了,這裡我們不在累述。抽象工廠的起源或是更早的應用,是為了用於建立分屬於不同作業系統的視窗構建,如按鈕(Button)、文字(Text)等等。我們來分析另一個例子:
例如一個應用,需要在不同平臺(Windows、Linux)上執行,你會怎麼設計?分別設計倆套不同應用?非也,通過抽象工廠模式遮蔽掉作業系統對應用的影響。軟體功能、邏輯、UI 都一個非常類似,唯一的不同是呼叫不同的工廠方法,由不同的產品類去處理與作業系統互動的資訊。
1.產品族
產品族是一組存在相關關係的物件,上例中,我們存在兩個產品族,一個是Windows 產品族,另一個是 Linux 產品族。即
public interface IWindowProduct {
}
public interface ILinuxProduct {
}
假設現在我們有兩個具體的產品,按鈕和文字,那麼
public class WindowsButton implements IWindowProduct { public WindowsButton() { System.out.println("create a Windows button"); } } public class WindowsText implements IWindowProduct { public WindowsText() { System.out.println("create a Windows text"); } } public class LinuxButton implements ILinuxProduct { public LinuxButton() { System.out.println("create a Linux button"); } } public class LinuxText implements ILinuxProduct { public LinuxText() { System.out.println("create a Linux text"); } }
2.工廠
首先我們可以定義一個工廠的介面,約束它能夠生產些什麼
public interface IFactory {
<T1 extends IWindowProduct> T1 createWindowProduct(Class<T1> cls);
<T2 extends ILinuxProduct> T2 createLinuxProduct(Class<T2> cls);
}
其次我們實現這個介面,完成具體的建立邏輯
public class ProductFactory implements IFactory { public <T1 extends IWindowProduct> T1 createWindowProduct(Class<T1> cls) { T1 windowProduct = null; try { windowProduct = (T1) Class.forName(cls.getName()).newInstance(); } catch (Exception e) { e.printStackTrace(); System.out.println("createWindowProduct failed! exception: " + e.toString()); } return windowProduct; } public <T2 extends ILinuxProduct> T2 createLinuxProduct(Class<T2> cls) { T2 linuxProduct = null; try { linuxProduct = (T2) Class.forName(cls.getName()).newInstance(); } catch (Exception e) { e.printStackTrace(); System.out.println("createLinuxProduct failed! exception: " + e.toString()); } return linuxProduct; } }
3.場景
public class Client {
public static void main(String[] args) {
ProductFactory productFactory = new ProductFactory();
// 製造 Button
WindowsButton windowsButton = productFactory.createWindowProduct(WindowsButton.class);
LinuxButton linuxButton = productFactory.createLinuxProduct(LinuxButton.class);
// 製造 Text
WindowsText windowsText = productFactory.createWindowProduct(WindowsText.class);
LinuxText linuxText = productFactory.createLinuxProduct(LinuxText.class);
// 具體的邏輯和互動由具體的產品類負責
}
}
執行結果為:create a Windows button
create a Linux button
create a Windows text
create a Linux text
三、通用原始碼類圖分析
其中 AbstractProductA 和 AbstractProductB 就是兩個產品族抽象,例如 Windows 產品族和 Linux產品族。而 Product1 和 Product2 就是產品族下的具體產品類,例如 Button、Text、Image 等等。AbstractCreator 就是工廠的抽象。
四、抽象工廠特點
1.和工廠方法一樣,具有良好的封裝性,抽象工廠是工廠方法的升級形式。
2.橫向擴充套件容易。例如增加一個 Image,我們只需要建立兩個具體的產品類 WindowsImage 和 LinuxImage,然後由工廠建立即可。
3.縱向擴充套件困難。例如新增一個新的產品族 Android,AbstractCreator 就需要對應增加一個 createAndroidProduct(),如果抽象工廠存在多個子類,那麼其所有子類也都要隨之更改,嚴重違背開閉原則。
相關推薦
抽象工廠模式詳解(四)
一、定義 為建立一組相關或者相互依賴的物件提供一個介面,而且無須指定它們的具體類。 簡單的說,抽象工廠模式是工廠方法模式的升級版本,當存在多個產品族時,產品族之間是存在相關或者依賴關係,可以使用抽象工廠來建立產品。二、例項分析 網上已
epoll詳解(四)-- LT模式例項
通過本文你會了解到: 1. epoll LT模式例項 2. 執行測試 約定 1. 格式為 /**/ 的註釋對程式的主要流程進行說明 2. 格式為 // 的註釋對程式的難懂語句進行說明 #include <stdio.h>
elastic-job詳解(四):失效轉移
shard out utm monit 設置 borde 點滴 title 等於 elastic-job中最關鍵的特性之一就是失效轉移。配置了失效轉移之後,如果在任務執行過程中有一個執行實例掛了,那麽之前被分配到這個實例的任務(或者分片)會在下次任務執行之前被重新分配到其他
設計模式詳解(一)
att 定義 面向對象設計 設計 sig com 繼承 行為模式 接口 一、設計模式定義 設計模式(Design Pattern)是一套被反復使用、多數人知曉的、經過分類的、代碼設計經驗的總結。 使用設計模式的目的:為了代碼可重用性、讓代碼更容易被他人理解、保證代碼可靠性。
郵件實現詳解(四)------JavaMail 發送(帶圖片和附件)和接收郵件
發送 網絡圖 發送對象 true n) com 訪問權限 sub map 好了,進入這個系列教程最主要的步驟了,前面郵件的理論知識我們都了解了,那麽這篇博客我們將用代碼完成郵件的發送。這在實際項目中應用的非常廣泛,比如註冊需要發送郵件進行賬號激活,再比如OA項目中利用郵
Spartan6芯片配置模式詳解(轉)
roc gen bit png 寬度 con 讀取配置 3.2 多個 1. 配置概述 Spartan6系列FPGA通過把應用程序數據導入芯片內部存儲器完成芯片的配置。Spart-6 FPGA可以自己從外部非易失性存儲器導入編程數據,或者通過外界的微處理器、DSP等對其進行
Quartz學習——SSMM(Spring+SpringMVC+Mybatis+Mysql)和Quartz集成詳解(四)
webapp cron表達式 msi 接口 cli post 定時 報錯 gets Quartz學習——SSMM(Spring+SpringMVC+Mybatis+Mysql)和Quartz集成詳解(四) 當任何時候覺你得難受了,其實你的大腦是在進化,當任何時候你覺得
07-Linux中DNS詳解(四)
用戶 mail all 驗證 src 更改 條目 http nslookup 接“06-Linux中DNS詳解(三)” 九、配置主從DNS服務器實現域名解析容錯 1、實驗環境zhangyujia.com(192.168.80.100)為主區域,com(192.168.8
編碼原理詳解(四)---之字形掃描
便是 集中 img 詳解 工作 -- 漢字 如何 編碼原理 上一篇我們講到,經過量化後得到了諸多零值和整數值,本篇接下來講講編碼過程中過對這些值如何組織和處理,那就是ZigZag掃描嘍。 一、簡介 ZigZag掃描也稱作之字形掃描,何以得此稱謂,是因為其掃描的路徑特
Nginx詳解(四)模塊
nginx https fastcgi 一、Nginx之目錄瀏覽二、Nginx之log模塊三、Ning之gzip模塊四、Nginx之https服務五、Nginx之fastCGI模塊 一、配置Nginx提供目錄瀏覽功能 1.修改nginx配置文件 server { listen
Zookeeper詳解(四):Zookeeper中的zkCli.sh客戶端使用
zkCli.sh zookeeper客戶端 最好配置上環境變量連接操作:zkCli.sh -timeout 1000 -r -server 127.0.0.1 # -timeout 設置客戶端和服務器之間的超時時長,單位毫秒 # -r 只讀模式,不加就是讀寫模式 # -server IP:PORT 要
Keepalived詳解(四)
mysql pan 節點 ios all -s 關閉 定義 interval 一.通過vrrp_script實現對集群資源的監控: Keepalived基礎HA功能時用到了vrrp_script這個模塊,此模塊專門用於對集群中服務資源進行監控。與此模塊一起使用
PE文件格式詳解(四)
ebs 位置 數位 地址 inf font pe文件 。。 地址轉換 PE文件格式詳解(四) 0x00 前言 上一篇介紹了區塊表的信息,以及如何在hexwrokshop找到區塊表。接下來,我們繼續深入了解區塊,並且學會文件偏移和虛擬地址轉換的知識。 0x01 區塊對齊值
PE檔案格式詳解(四)
PE檔案格式詳解(四) 0x00 前言 上一篇介紹了區塊表的資訊,以及如何在hexwrokshop找到區塊表。接下來,我們繼續深入瞭解區塊,並且學會檔案偏移和虛擬地址轉換的知識。 0x01 區塊對齊值 首先我們要知道啥事區塊對齊?為啥要區塊對齊?這個問題
安卓專案實戰之強大的網路請求框架okGo使用詳解(四):Cookie的管理
Cookie概念相關 具體來說cookie機制採用的是在客戶端保持狀態的方案,而session機制採用的是在伺服器端保持狀態的方案。同時我們也看到,由於採用伺服器端保持狀態的方案在客戶端也需要儲存一個標識,所以session機制是需要藉助於cookie機制來達到儲存標識的目的,所謂ses
Jmater (十七) 命令列(非GUI)模式詳解(二) 執行代理設定
閒話少述,接 上文繼續。。。 5、設定代理 jmeter -n -t Jmeter分散式測試示例.jmx -H 20.9.215.90 -P 9999 -1 report\01-result.csv -j report\01-log.log 注意:-H 20.9.215.9
Jmater (十八) 命令列(非GUI)模式詳解(三) 測試圖形化 HTML報表(dashboard)生成
閒話少述,接上文繼續。。。 5、生成測試報表 生成測試報表前,需要先生成效能測試結果 jtl 或 csv 檔案,用於測試結果的生成。 jmeter -n -t JMeter分散式測試示例.jmx -r -l report\01-result.csv -j report\01-lo
【SpringBoot學習之路】08.Springboot配置檔案詳解(四)
轉載宣告:商業轉載請聯絡作者獲得授權,非商業轉載請註明出處.原文來自 © 呆萌鍾【SpringBoot學習之路】08.Springboot配置檔案詳解(四) 自動配置原理 配置檔案到底能寫什麼?怎麼寫?自動配置原理; 配置檔案能配置的屬性參照
Java 反射機制詳解(四)
Java 反射機制詳解(四) 4. 反射與泛型 定義一個泛型類: public class DAO<T> { //根據id獲取一個物件 T get(Integer id){ return null; }