設計模式學習總結1 - 創建型1 - Abstract Factory抽象工廠模式

AbstractFactory抽象工廠模式(創建型

作用:

這種模式支持創建不同的對象,這些對象功能接近且一般都是在一起創建的。抽象工廠被具體化成不同的工廠來創建類似產品的不同產品。這種模式將類于使用的客戶端分離以便通過工廠來創建。這樣,各類產品可以方便的變化而不需要改變使用者的結構。

Role
This pattern supports the creation of products that exist in families and are designed to be produced together. The abstract factory can be refined to concrete factories,each of which can create different products of different types and in different combinations. The pattern isolates the product definitions and their class names from the client so that the only way to get one of them is through a factory. For this reason, product families can easily be interchanged or updated without upsetting the structure of the client.

設計:

抽象工廠接口IAbstractFactory,含有創建各類抽象產品abstract products的操作;

工廠1Factory1, 工廠2Factory2,實現了抽象工廠接口IAbstractFactory的創建產品的操作;

抽象產品接口IProductA,IProductB,含有某類產品自有的操作;

具體產品ProductA1, ProductA2, ProductB1, ProductB2,實現了抽象產品接口的具體產品類,這些具體產品類由相應的工廠生產;

舉例:

AbstractFactory???? 生產一種鋼筆
FactoryA?????????????? 英雄鋼筆廠
FactoryB?????????????? 永生鋼筆廠
AbstractProduct???? 鋼筆產品
ProductA1???????????? 英雄金筆
ProductB1???????????? 永生金筆

ProductA2???????????? 英雄軟筆
ProductB2???????????? 永生軟筆
代碼:?

ExpandedBlockStart.gif代碼
using?System;
using?System.Collections.Generic;
using?System.Linq;
using?System.Text;

namespace?AbstractFactory
{
????
//抽象工廠
????abstract?class?AbstractFactory
????{
????????
abstract?public?AbstractWheel?CreatWheel();
????????
abstract?public?AbstractOilBox?CreatOilBox();
????}


????
abstract?class?AbstractWheel
????{
????????
public?AbstractWheel()
????????{
????????????
//Console.Write("Create?a?AbstractProduct");
????????}
????}

????
abstract?class?AbstractOilBox
????{
????????
public?AbstractOilBox()
????????{?}
????}


????
class?BMWFactory?:?AbstractFactory
????{
????????
public?override?AbstractWheel?CreatWheel()
????????{
????????????
return?new?BMWWheel();
????????}

????????
public?override?AbstractOilBox?CreatOilBox()
????????{
????????????
return?new?BMWOilBox();
????????}
????}

????
class?BMWWheel?:?AbstractWheel
????{
????????
public?BMWWheel()
????????{
????????????Console.WriteLine(
"Create?a?BMWwheel");
????????}
????}

????
class?BMWOilBox?:?AbstractOilBox
????{
????????
public?BMWOilBox()
????????{
????????????Console.WriteLine(
"Create?a?BMWOilBox");
????????}
????}

????
class?BORAWheel:AbstractWheel
?????{
??????
public?BORAWheel()
??????{
???????Console.Write(
"Create?a?BORAWheel");
??????}
?????}

?????
class?BORAOilBox:AbstractOilBox
?????{
??????
public?BORAOilBox()
??????{
???????Console.Write(
"Create?a?BORAOilBox");
??????}
?????}
?????????
?????
class?BORAFactory:AbstractFactory
?????{
??????
public?override?AbstractWheel?CreatWheel()
??????{
???????
return?new?BORAWheel();
??????}

??????
public?override?AbstractOilBox?CreatOilBox()
??????{
???????
return?new?BORAOilBox();
??????}

?????}


????
????
class?Program
????{
????????
static?void?Main(string[]?args)
????????{
????????????AbstractFactory?factory?
=?null;
????????????factory?
=?new?BORAFactory();
????????????factory.CreatWheel();
????????????factory.CreatOilBox();
????????????Console.ReadLine();

????????????factory?
=?new?BMWFactory();
????????????factory.CreatWheel();
????????????factory.CreatOilBox();
????????????Console.ReadLine();
????????}
????}
}

?

?使用場景:

1、系統不依賴他要使用對象的創建、組成、表示
2、系統需要配置使用多組對象
3、創建對象和工廠必須是強制使用的
4、重點是要暴露接口而不是實現

Use the Abstract Factory pattern when…
?? A system should be independent of how its products are created, composed, and represented.
?? A system can be configured with one of multiple families of products.
?? The constraint requiring products from the same factory to be used together must be enforced.
?? The emphasis is on revealing interfaces, not implementations.

總結:

????? 抽象工廠模式是一種創建型模式,目的是解決實例化對象時所帶來的問題。在現實中系統總是需要變化來實例化不同的對象,因此封裝“創建操作”到抽象工廠,由具體的工廠來實例相應的對象。抽象工廠模式面向接口,將實例化對象的操作封裝起來,不同的工廠都實現實例對象的操作。
????? 在系統中,經常會遇到“一組相互依賴的對象”的創建工作;同時,由于需求的變化,往往存在更多系列對象的創建工作。面對這種問題,避免使用常規的對象創建方法,使用“封裝實例華對象”來避免系統和這種“多系列具體對象創建工作”的緊耦合。
????? 在需求穩定。系統基本無變化的情況下松耦合和緊耦合是沒有區別的,但是需求的變化,要求在某些方面將系統"解耦",抽象工廠就是將對象的實例化和系統解耦。
???? 《設計模式》:提供一個接口,讓該接口負責創建一系列“相關或者相互依賴的對象”,無需指定他們的具體類。Abstract Factory模式的幾個要點:
???? 1、如果沒有應對“多系列對象構建”的需求變化,則沒有必要使用Abstract Factory模式。
???? 2、“系列對象”指的是這項對象之間有相互依賴、或作用的關系。
???? 3、Abstract Factory模式主要在于應對“新系列”的需求變動。缺點是難以應對“新對象”的需求變動。這一點應該注意,就像前面說的,如果我們現在要在加入其他系列的類,代碼的改動會很大。
??? ?4、Abstract Factory模式經常和Factory Method模式共同組合來應對“對象創建”的需求變化。

轉載于:https://www.cnblogs.com/utopia/archive/2010/02/28/1675216.html

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

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

相關文章

QT練習9 Dialog學習

http://files.cnblogs.com/hnrainll/dialog.zip 源代碼下載轉載于:https://www.cnblogs.com/hnrainll/archive/2011/05/30/2063135.html

C#中NULL,,DBNULL,String.Empty,Convert.IsDBNull()的區別

C#中的空值的判斷較麻煩,不象在VB6中那么簡單,這些各種空值的判斷和理解對不熟悉的人來說,可能很麻煩,現就我在使用過程中的一點體會和大家共同分享。 (1)NULL null 關鍵字是表示不引用任何對象的空引用的文字值。null 是引用類型…

關于初始化C++類成員

轉自:http://www.vckbase.com/document/viewdoc/?id584 在使用C編程的過程當中,常常需要對類成員進行初始化,通常的方法有兩種: 第一種方法: CMYClass::CSomeClass() {x0;y1; } 第二種方法: CSomeClass::CSomeClass…

ASP.NET 2.0 中的新增服務、控件與功能概述(四)

原文出自http://blog.sina.com.cn/s/blog_48b6cd65010004fc.html個性化 另一個新增的服務是個性化,它提供了一種現成的解決方案,用于解決存儲站點用戶的個性化設置問題。目前,此類設置通常存儲在Cookie、后端數據庫或這兩者中。無論這些設置存…

C/C++ 交換兩個數,不使用第三個變量, 函數模板來實現

#include <iostream>template<typename T> void exchangeTwoNumber(T &t1, T &t2)&#xff1b;void test();int main() {int a 10, b 20;double q 10.1, w 20.2;char z z, x x;std::cout << "交換前的 a " << a << &qu…

Oracle錯誤集!

個人使用Oracle時出現的錯誤&#xff0c;在這里記下來&#xff0c;加深印象。 1、ORA-20000: ORU-10027: buffer overflow, limit of 2000 bytes 今天寫存儲過程時&#xff0c;使用dbms_output.put_line(result:||i||---||documentID);輸出測試結果。當我設置其輸出記錄較多…

[原+轉]CSS hack 小技巧 讓你的CSS 兼容ff ie6.0 ie7.0

在做東西的時候發現在ie6.0中做的東西到ff下面目全非100% css不兼容不問題 查閱了相關資料 個人感覺以下是一個笨的也是比較快的處理兼容問題的方法方法就是針對不同的瀏覽器寫不同的css 以前用!important 但是ie7 和ff 就不好分了個人感覺比較好的方法是 samplepadding:0px; …

準備試用svn

用了VSS2005感覺一般&#xff0c;準備試用svn&#xff01;&#xff01;&#xff01;轉載于:https://www.cnblogs.com/jessenee/archive/2008/03/31/1131027.html

web功底之強,實屬罕見。。

不看不知道&#xff0c;一看汗得死你了。。純用html做的。不多說&#xff0c;看看就知道了&#xff0c;http://www.kanqq.com/qq/smilies/ku.htm 以人格保證&#xff0c;不是病毒網頁。。。 轉載于:https://www.cnblogs.com/lsgoodsun/archive/2007/11/04/949222.html

第三次作業-Scrum

理解&#xff1a; 首先&#xff0c;敏捷并不是一門具體的技術&#xff0c;而是一種理念或者說是一種思想。它可以指導我們更加高效的開發。其次&#xff0c;敏捷開發都具有以下共同的特征&#xff1a; 1.迭代式開發2. 增量交付 3. 開發團隊和用戶反饋推動產品開發 4. …

如何處理錯誤消息Please install the gcc make perl packages

2019獨角獸企業重金招聘Python工程師標準>>> 如何處理這行錯誤消息&#xff1f; Please install the gcc make perl packages from your distribution。 執行命令行&#xff1a;yum install gcc perl make 輸出&#xff1a; Loaded plugins: product-id, search-dis…

iOS開發 CGAffineTransform 讓圖片旋轉, 旋轉后獲得圖片旋轉的角度

1.讓圖片旋轉 UIImageView *imageView [[UIImageView alloc]init]; imageView.frame CGRectMake(50, 50, 200, 200); imageView.image [UIImage imageNamed:"460.jpg"]; CGAffineTransform transform CGAffineTransformMakeRotation(M_PI*0.38); imageView.tr…

致畢業生:那些年我們錯過的“BAT”

本文旨在用最通俗的語言講述最枯燥的基本知識最近看到公眾號中各種推“招聘季金九銀十銅十二”之類的文章&#xff0c;把畢業季找工作需要應對的事情和解決方法都已經寫的很詳細了&#xff0c;還有各種面經考經揮之即來&#xff0c;已經沒必要再去寫這樣的一個文章了&#xff0…

PHP函數收藏---不斷更新中!

替換html標簽 function strip_bad_tags($html) { $s preg_replace ("?[^>]*>*", "", $html); return $s; } 替換指定tag,$text是需要替換的文本,tags 是需要替換標簽的數組 function strip_selected_tags($text, $tags array()) { $args func_ge…

gcc 5.2.0 手動更新(親測)

注意:(不要在gcc-5.2.0 源碼目錄中執行 configure&#xff0c;否則會報錯)安裝操作如下&#xff1a;0、yum 安裝 gcc yum -y install gcc gcc-c libstdc libstdc-devel autoconf makegcc-5.2.0 下載地址&#xff1a;ftp://gcc.gnu.org/pub/gcc/releases/gcc-5.2.0/gcc-5.2.0…

Lie to me不錯

最近Fox的新劇有個Lie to me不錯&#xff0c;如果你膩了了沒完沒了的Lost&#xff0c;覺得Hero開始離譜了&#xff0c;Prison Break只能重看第一季了&#xff0c;懷念Friends的經典又不忍心再看第10遍的話&#xff0c;這個劇是個不錯的選擇。 看了一集了&#xff0c;每個人平均…

NLog 簡單使用

1.安裝NLog 使其集成到VS 里 下載地址&#xff1a; http://nlog-project.org/ 2.NLog.config <?xml version"1.0" encoding"utf-8" ?> <nlog xmlns"http://www.nlog-project.org/schemas/NLog.xsd"xmlns:xsi"http://www.w3.or…

10.31T2 點雙聯通分量+預處理前綴+二分答案

2.逛公園I (parka) 【問題描述】 琥珀色黃昏像糖在很美的遠方&#xff0c;思念跟影子在傍晚一起被拉長…… 小 B 帶著 GF 去逛公園&#xff0c;公園一共有 n 個景點&#xff0c;標號為 1 . . . n。景點之間有 m 條路徑相連。 小 B 想選擇編號在一段區間 [l, r] 內的…

SQL學習筆記之存儲過程的編寫

今天寫幾個存儲過程&#xff0c;覺得有這個必要記錄下來&#xff0c;方便以后忘了也好有個備份&#xff0c;都很簡單&#xff0c;高手可以不用看的。一、記錄的插入--region [dbo].[InsertArchive]--------------------------------------------------------------------------…

應用安全-操作系統安全-漏洞修復整理

FTP弱密碼 將FTP服務器的密碼更改為強密碼 vi /etc/vsftpd/vsftpd.conf anonymous_enableNO #禁止匿名登錄 重啟ftp服務 Windows匿名用戶整改參考&#xff1a; https://www.jb51.net/article/135347.htm View CodeSSH弱密碼 修改ssh配置文件&#xff1a; 1.修改iptables 首先要…