當前位置:
首頁 > 知識 > 直截了當的告訴你什麼是工廠模式

直截了當的告訴你什麼是工廠模式

千萬不要以為創建一個類,以Factory為後綴就是工廠,那不是工廠。

直接演示:

public interface IMachine
{
string Name { get; }
///

/// 機器啟動
///

void TurnOn;
}

public class Computer : IMachine
{
public string Name
{
get { return "戴爾"; }
}

public void TurnOn
{
Console.WriteLine("電腦啟動");
}
}
public class Mobile : IMachine
{
public string Name
{
get { return "魅族"; }
}

public void TurnOn
{
Console.WriteLine("手機啟動");
}
}
public class UnknownMachine : IMachine
{
public string Name
{
get { return "機器故障" }
}

public void TurnOn
{
Console.WriteLine("啟動失敗");
}
}

class Program
{
static void Main(string[] args)
{
string description = "computer";
IMachine machine = GetMachine(description);
machine.TurnOn;

Console.ReadKey;
}
private static IMachine GetMachine(string description)
{
switch (description)
{
case "computer":
return new Computer;
case "mobile":
return new Mobile;
default:
return new UnknownMachine;
}
}
}

上面代碼一執行,IMachine介面里裝的Computer,所以電腦啟動了

工廠模式登場

public class MachineFactory
{
private Dictionary _machines;

public MachineFactory
{
LoadTypesICanReturn;
}

public IMachine CreateInstance(string description)
{
Type t = GetTypeToCreate(description);

if (t == null)
return new UnknownMachine;

return Activator.CreateInstance(t) as IMachine;
}

private Type GetTypeToCreate(string machineName)
{
foreach (var machine in _machines)
{
if (machine.Key.Contains(machineName))
{
return _machines[machine.Key];
}
}

return null;
}

private void LoadTypesICanReturn
{
_machines = new Dictionary;

Type typesInThisAssembly = Assembly.GetExecutingAssembly.GetTypes;

foreach (Type type in typesInThisAssembly)
{
if (type.GetInterface(nameof(IMachine)) != null)
{
_machines.Add(type.Name, type);
}
}
}
}

static void Main(string[] args)
{
string description = "Computer";
IMachine machine = new MachineFactory.CreateInstance(description);
machine.TurnOn;

Console.ReadKey;
}

CreateInstance方法也可以設計成靜態的

MachineFactory.CreateInstance(description);

在抽象一點可以讓MachineFactory實現IMachineFactory介面

public interface IMachineFactory
{
IMachine CreateInstance(string description);
}

public class MachineFactory : IMachineFactory

直截了當的告訴你什麼是工廠模式

static void Main(string[] args)
{
string description = "Computer";
IMachine machine = LoadFactory.CreateInstance(description);
machine.TurnOn;

Console.ReadKey;
}

private static IMachineFactory LoadFactory
{
string factoryName = Properties.Settings.Default.DefaultMachineFactory;
return Assembly.GetExecutingAssembly.CreateInstance(factoryName) as IMachineFactory;
}

如果沒有上面的IMachineFactory介面,那麼具體的工廠將與其生產的具體類型緊密耦合,我認為這也是可以接受的。好了。就是這麼直截了當,簡單粗暴。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 達人科技 的精彩文章:

React 實踐項目(三)
包裝類、數組、string類淺析及練習
Hadoop源碼系列(一)FairScheduler申請和分配container的過程
Android系統——輸入系統(十五)實戰 使用GlobalKey一鍵啟動程序
MySql單表最大8000W+ 之資料庫遇瓶頸記

TAG:達人科技 |

您可能感興趣

一張圖告訴你什麼是智能工廠!
為什麼玻璃工廠不能停工?停了又會怎樣?看完真是漲知識了
工廠的伙食到底怎麼樣,幾張圖片告訴你,還真心可以
特斯拉被起訴員工回應潛入工廠搞破壞:我不是我沒有別瞎說啊!
未來的工廠應該是個什麼樣子?
為什麼有的工廠賠錢還要繼續幹下去?工廠老闆訴說真相,很現實!
世界最「奇葩」工廠,員工上班需要穿紙尿褲,這是怎麼回事?
為什麼現在,越來越多的越南工廠被迫倒閉呢?答案並不是你想的那樣
身體的「大工廠」若出了問題,手指會告訴你,不信就看你的中指
現在的工廠為什麼越來越難招工了?看完後我再也不去工廠了
多蘭地服裝告訴你:褲子加工廠都做些什麼?
你們工廠有多少料箱?你是怎麼給它們洗澡的?
為什麼現在的工廠招工那麼難?原因很無奈
瞧瞧這些工廠車間,再看看自己,你憑什麼做不到?
這才是工廠的「質量管理」,你那隻叫瞎管……
蘋果手機為什麼敢找代工廠?不怕機密泄露嗎?答案說出來你都不信
富士康到底是良心工廠還是血汗工廠?來看看這些一線員工怎麼說吧
羅永浩再被打臉,代工廠不想接單,工作站這次被革命了
那些不願在工廠上班,選擇回老家的人,為什麼最後都回到了工廠?
工廠搬遷男子嫌路遠辭職不幹,想要賠償被拒將工廠告上法庭後勝訴