接上一篇的工廠方法繼續工廠模式的練習。 先看一下抽象工廠的結構圖 產品族: 在上面的產品列表中呢,有兩個產品族,一個是“具體產品A--1”和”具體產品B--1“組成的一個族, 還有一個是“具體產品A--2”和“具體產品B--2”組成的一個族。 產品族就是在不同產品等級結構中,功能相關聯的產品組成的家 ...
接上一篇的工廠方法繼續工廠模式的練習。
先看一下抽象工廠的結構圖
產品族:
在上面的產品列表中呢,有兩個產品族,一個是“具體產品A--1”和”具體產品B--1“組成的一個族,
還有一個是“具體產品A--2”和“具體產品B--2”組成的一個族。
產品族就是在不同產品等級結構中,功能相關聯的產品組成的家族。
抽象工廠的定義:
提供一個創建一系列相關或者是相互依賴對象的介面,而無需指定它們具體的類
這副類圖中可以看出,每一個具體的工廠,它都只負責創建一個產品族中的產品的實例,
從抽象工廠中派生出的具體工廠,這些具體工廠產生相同的產品(這些產品都繼承自同一父類),
比如,ConcreteFactory1 和 ConcreteFactory2 中的 CreateProductA 這個方法都是產生 AbstractProductA 這種類型的產品,
但是產品的實現卻是不同的,比如 ConcreteFactory1 中的 CreateProductA 實現的是產生一個 ConcreteProductA—1 產品,
而 ConcreteFactory2 中的 CreateProductA 實現的是產生一個 ConcreteProductA—2 產品,
總的來說就是不同的具體工廠產生不同的產品族,
而抽象工廠則是定義一個負責創建一組產品(也就是一個產品族)的介面,
比如上面的類圖中只存在兩個產品族,所以在抽象工廠中便只需要定義兩個介面就可以了。
實現思路:
這裡我們以支付寶和微信舉例:
支付寶和微信屬於兩個產品,這兩個產品有兩個共有的功能是:聊天和支付。
但兩個產品的這兩個功能實現機制不同,所以這裡用抽象工廠模式實現這個場景。
工廠:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace AbstractFactory { /// <summary> /// 支付;支付產品族 /// </summary> public abstract class Pay { public abstract void PayWay(); } /// <summary> /// 聊天;聊天產品族 /// </summary> public abstract class Talk { public abstract void TalkWay(); } /// <summary> /// 抽象工廠,應該包含所有共有方法,提供被其他子工廠繼承 /// </summary> public abstract class AbstractFactory { public abstract Pay CreatePay(); public abstract Talk CreakTalk(); } /// <summary> /// 阿裡支付實現 /// </summary> public class AliPay : Pay { public override void PayWay() { Console.WriteLine("我使用的支付產品是支付寶:{0}",this.GetType()); } } /// <summary> /// 微信支付實現 /// </summary> public class WeChatPay : Pay { public override void PayWay() { Console.WriteLine("我使用的支付產品是微信:{0}",this.GetType()); } } /// <summary> /// 阿裡聊天實現 /// </summary> public class AliTalk : Talk { public override void TalkWay() { Console.WriteLine("我使用的聊天產品是支付寶:{0}", this.GetType()); } } /// <summary> /// 微信聊天實現 /// </summary> public class WeChatTalk : Talk { public override void TalkWay() { Console.WriteLine("我使用的聊天產品是微信:{0}", this.GetType()); } } /// <summary> /// 支付寶工廠實現 /// </summary> public class AliFactory : AbstractFactory { public override Pay CreatePay() { return new AliPay(); } public override Talk CreakTalk() { return new AliTalk(); } } /// <summary> /// 微信工廠實現 /// </summary> public class WeChatFactory : AbstractFactory { public override Pay CreatePay() { return new WeChatPay(); } public override Talk CreakTalk() { return new WeChatTalk(); } } }
客戶端:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace AbstractFactory { class Program { static void Main(string[] args) { AbstractFactory abstractFactory; Pay pay; Talk talk; //*****************阿裡產品 abstractFactory = new AliFactory(); pay = abstractFactory.CreatePay(); pay.PayWay(); talk = abstractFactory.CreakTalk(); talk.TalkWay(); //*****************微信產品 Console.WriteLine(); abstractFactory = new WeChatFactory(); pay = abstractFactory.CreatePay(); pay.PayWay(); talk = abstractFactory.CreakTalk(); talk.TalkWay(); Console.ReadLine(); } } }
效果:
在現實的業務中,如果用到工廠方法,大大能增加業務的彈性。