一、概述 提供一個創建一系列相關或相互依賴對象的介面,而無需指定它們具體的類。 二、模式中的角色 AbstarctProduct(IProduct):為一類產品對象聲明一個介面; ConcreteProduct(MySqlProduct、SqlServerProduct):定義一個將被相應的具體工廠 ...
一、概述
提供一個創建一系列相關或相互依賴對象的介面,而無需指定它們具體的類。
二、模式中的角色
AbstarctProduct(IProduct):為一類產品對象聲明一個介面;
ConcreteProduct(MySqlProduct、SqlServerProduct):定義一個將被相應的具體工廠創建的產品對象,實現AbstarctProduct介面;
AbstarctFactory:聲明一個創建抽象產品對象的操作介面;
ConcreteFactory:實現創建具體產品對象的操作;
三、UML類圖
四、代碼實現
針對這個應用場景,又做了簡單的一些改變,更能滿足需求的變化,代碼如下
/// <summary> /// 產品介面 /// </summary> public interface IProduct { void Add(); void Update(); void Delete(); } public class SqlServerProduct:IProduct { public void Add() { Console.WriteLine("SqlServer添加了一條數據"); } public void Update() { Console.WriteLine("SqlServer更新了一條數據"); } public void Delete() { Console.WriteLine("SqlServer刪除了一條數據"); } } public class MySqlProduct : IProduct { public void Add() { Console.WriteLine("MySql添加了一條數據"); } public void Update() { Console.WriteLine("MySql更新了一條數據"); } public void Delete() { Console.WriteLine("MySql刪除了一條數據"); } } public class Access { private static readonly string AssemblyName = "Rich.ConsoleTest"; private static readonly string db = ConfigurationManager.AppSettings["DB"]; public static IProduct CreateProduct() { string className = AssemblyName + ".AbstractFactory." + db + "Product"; return (IProduct)Assembly.Load(AssemblyName).CreateInstance(className); } } #region 虛構工廠模式 IProduct product = Access.CreateProduct(); product.Add(); product.Update(); product.Delete(); #endregion
若要更換對象,只需更換DB配置即可;
5、應用場景
5.1:一個系統要獨立於它的產品創建、組合和表示時;
5.2:一個系統要由多個產品系列中的一個來配置時;
5.3:當你要強調一系列相關產品對象的設計以便進行聯合使用時;
5.4:當你提供一個產品類庫,而只想顯示它們的介面而不是實現時;
參考書籍《設計模式-可復用面向對象軟體的基礎》