1. 程式人生 > >抽象工廠模式詳解(四)

抽象工廠模式詳解(四)

一、定義

        為建立一組相關或者相互依賴的物件提供一個介面,而且無須指定它們的具體類。

        簡單的說,抽象工廠模式是工廠方法模式的升級版本,當存在多個產品族時,產品族之間是存在相關或者依賴關係,可以使用抽象工廠來建立產品。

二、例項分析

        網上已經有很多關於寶馬的抽象工廠的例子了,這裡我們不在累述。抽象工廠的起源或是更早的應用,是為了用於建立分屬於不同作業系統的視窗構建,如按鈕(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; }