>>回傳《C#常用設計模式》
- 1. 簡介
- 2. 示例
- 2.1. 武器工廠例子
- 2.1.1. 簡單工廠
- 2.1.2. 工廠方法
- 2.2. 資料庫訪問工廠示例代碼
- 2.1. 武器工廠例子
1. 簡介
- 動機
- 在軟體系統中,經常面臨“某個物件”的創建作業;由于需求的變化,這個物件經常面臨著劇烈的變化,但是它卻擁有比較穩定的介面,
- “封裝機制”來隔離出“這個易變物件”的變化,從而保持系統中“其他依賴物件的物件”不隨著需求變化而變化
- 意圖
- 定義一個用于創建物件的介面,讓子類決定實體化哪一個類,Factory Method使得一個類的實體化延遲到子類,
2. 示例
2.1. 武器工廠例子
2.1.1. 簡單工廠
一個需要通過工廠創建物件的需求,所以不需要抽象,那么武器工廠就是具體實作類通過傳參不同,制造不同的武器,回傳型別為基類武器,實際物件為繼承該基類的物件,

2.1.2. 工廠方法
時間定位在冷兵器的年代,武器種類的需求開始出現,單個工廠的方式出現問題:
- 代碼邏輯復雜: 一個工廠負責所有產品生產
- 難以維護: 每當新增一個產品都需要修改這個工廠,這時不能保證原有業務不受影響
這時引入了工廠方法模式,可以解決這些問題,
示例:
開始生產的是匕首、太刀,后來需求變化需要寶劍的生產,而且預計后面還會生產其他的武器,
- 工廠方法類有且只有一個生產的產品線(方法),比如定義為:武器工廠來生產武器;
- 具體的工廠類繼承工廠介面,比如:匕首工廠繼承武器工廠介面
- 實際產品為:匕首(繼承自武器)
- 設計帶來的適應性:
- 開始工廠生產的是匕首、太刀,后來因為要適配新武器方便添加的需求,簡單工廠模式升級為工廠方法模式
- 當新種類的武器(寶劍)需要生產,只需要增加寶劍工廠來滿足需求,這個工廠可以生產寶劍,寶劍繼承基類武器,

2.2. 資料庫訪問工廠示例代碼
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Demo
{
class Program
{
static IFactory fac = new MySQLFactory();
static void Main(string[] args)
{
ISqlHelper sqlHelper = fac.CreateSqlHelper();
sqlHelper.Execute();
Console.ReadKey();
}
}
#region 定義介面
//約定工廠能創建那個型別產品 武器工廠
public interface IFactory
{
ISqlHelper CreateSqlHelper();
}
//約定工廠產品的特點 武器
public interface ISqlHelper
{
int Execute();
object ExecuteScale();
}
#endregion
#region 具體實作
//工廠方法的具體實作 太刀工廠
public class MSSQLFactory : IFactory
{
public ISqlHelper CreateSqlHelper()
{
return new MSSQLSqlHelper();
}
}
//工廠方法的具體實作2 匕首工廠
public class MySQLFactory : IFactory
{
public ISqlHelper CreateSqlHelper()
{
return new MySQLSqlHelper();
}
}
//產品的具體實作 匕首
public class MySQLSqlHelper : ISqlHelper
{
public int Execute()
{
Console.WriteLine("MySQLExecute");
return 1;
}
public object ExecuteScale()
{
Console.WriteLine("MySQLExecuteScale");
return new object();
}
}
//產品的具體實作2 太刀
public class MSSQLSqlHelper : ISqlHelper
{
public int Execute()
{
Console.WriteLine("MSSQLExecute");
return 1;
}
public object ExecuteScale()
{
Console.WriteLine("MSSQLExecuteScale");
return new object();
}
}
#endregion
}
參考資料:
https://www.cnblogs.com/sanjun/p/9972386.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/258356.html
標籤:其他
上一篇:Singleton單例模式
下一篇:RabbitMQ 簡介
