參考文獻(xiàn):
http://en.wikipedia.org/wiki/Abstract_factory_pattern
??? 抽象工廠模式(英語:Abstract Factory)是一種常見的設(shè)計(jì)模式。此模式為一個(gè)產(chǎn)品家族提供了統(tǒng)一的創(chuàng)建接口。當(dāng)需要這個(gè)產(chǎn)品家族的某一系列的時(shí)候,可以從抽象工廠中選出相對(duì)系的系列來創(chuàng)建一個(gè)具體的工廠類別。
例子
??? 假設(shè)我們有兩種產(chǎn)品接口 Button 和 Border ,每一種產(chǎn)品都支持多種系列,比如 Mac 系列和 Windows 系列。這樣每個(gè)系列的產(chǎn)品分別是 MacButton, WinButton, MacBorder, WinBorder 。為了可以在運(yùn)行時(shí)刻創(chuàng)建一個(gè)系列的產(chǎn)品族,我們可以為每個(gè)系列的產(chǎn)品族建立一個(gè)工廠 MacFactory 和 WinFactory 。每個(gè)工廠都有兩個(gè)方法 CreateButton 和 CreateBorder 并返回對(duì)應(yīng)的產(chǎn)品,可以將這兩個(gè)方法抽象成一個(gè)接口 AbstractFactory 。這樣在運(yùn)行時(shí)刻我們可以選擇創(chuàng)建需要的產(chǎn)品系列。
適用性
在以下情況可以使用抽象工廠模式
一個(gè)系統(tǒng)要獨(dú)立于它的產(chǎn)品的創(chuàng)建、組合和表示時(shí)。
一個(gè)系統(tǒng)要由多個(gè)產(chǎn)品系列中的一個(gè)來配置時(shí)。
當(dāng)你要強(qiáng)調(diào)一系列相關(guān)的產(chǎn)品對(duì)象的設(shè)計(jì)以便進(jìn)行聯(lián)合使用時(shí)。
當(dāng)你提供一個(gè)產(chǎn)品類庫(kù),而只想顯示它們的接口而不是實(shí)現(xiàn)時(shí)
優(yōu)點(diǎn)
具體產(chǎn)品從客戶代碼中被分離出來
容易改變產(chǎn)品的系列
將一個(gè)系列的產(chǎn)品族統(tǒng)一到一起創(chuàng)建
缺點(diǎn)
在產(chǎn)品族中擴(kuò)展新的產(chǎn)品是很困難的,它需要修改抽象工廠的接口
http://en.wikipedia.org/wiki/Abstract_factory_pattern
??? 抽象工廠模式(英語:Abstract Factory)是一種常見的設(shè)計(jì)模式。此模式為一個(gè)產(chǎn)品家族提供了統(tǒng)一的創(chuàng)建接口。當(dāng)需要這個(gè)產(chǎn)品家族的某一系列的時(shí)候,可以從抽象工廠中選出相對(duì)系的系列來創(chuàng)建一個(gè)具體的工廠類別。
例子
??? 假設(shè)我們有兩種產(chǎn)品接口 Button 和 Border ,每一種產(chǎn)品都支持多種系列,比如 Mac 系列和 Windows 系列。這樣每個(gè)系列的產(chǎn)品分別是 MacButton, WinButton, MacBorder, WinBorder 。為了可以在運(yùn)行時(shí)刻創(chuàng)建一個(gè)系列的產(chǎn)品族,我們可以為每個(gè)系列的產(chǎn)品族建立一個(gè)工廠 MacFactory 和 WinFactory 。每個(gè)工廠都有兩個(gè)方法 CreateButton 和 CreateBorder 并返回對(duì)應(yīng)的產(chǎn)品,可以將這兩個(gè)方法抽象成一個(gè)接口 AbstractFactory 。這樣在運(yùn)行時(shí)刻我們可以選擇創(chuàng)建需要的產(chǎn)品系列。
package com.sinosoft.train.gof.cp; interface GUIFactory { public Button createButton(); } class WinFactory implements GUIFactory { public Button createButton() { return new WinButton(); } } class OSXFactory implements GUIFactory { public Button createButton() { return new OSXButton(); } } interface Button { public void paint(); } class WinButton implements Button { public void paint() { System.out.println("I'm a WinButton"); } } class OSXButton implements Button { public void paint() { System.out.println("I'm an OSXButton"); } } class Application { public Application(GUIFactory factory){ Button button = factory.createButton(); button.paint(); } } public class AbstractFactory { public static void main(String[] args) { new Application(createOsSpecificFactory()); } public static GUIFactory createOsSpecificFactory() { int sys = 0; if (sys == 1) { return new WinFactory(); } else { return new OSXFactory(); } } }
適用性
在以下情況可以使用抽象工廠模式
一個(gè)系統(tǒng)要獨(dú)立于它的產(chǎn)品的創(chuàng)建、組合和表示時(shí)。
一個(gè)系統(tǒng)要由多個(gè)產(chǎn)品系列中的一個(gè)來配置時(shí)。
當(dāng)你要強(qiáng)調(diào)一系列相關(guān)的產(chǎn)品對(duì)象的設(shè)計(jì)以便進(jìn)行聯(lián)合使用時(shí)。
當(dāng)你提供一個(gè)產(chǎn)品類庫(kù),而只想顯示它們的接口而不是實(shí)現(xiàn)時(shí)
優(yōu)點(diǎn)
具體產(chǎn)品從客戶代碼中被分離出來
容易改變產(chǎn)品的系列
將一個(gè)系列的產(chǎn)品族統(tǒng)一到一起創(chuàng)建
缺點(diǎn)
在產(chǎn)品族中擴(kuò)展新的產(chǎn)品是很困難的,它需要修改抽象工廠的接口
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
