直截了當的告訴你什麼是工廠模式
千萬不要以為創建一個類,以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
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介面,那麼具體的工廠將與其生產的具體類型緊密耦合,我認為這也是可以接受的。好了。就是這麼直截了當,簡單粗暴。
![](https://pic.pimg.tw/zzuyanan/1488615166-1259157397.png)
![](https://pic.pimg.tw/zzuyanan/1482887990-2595557020.jpg)
※React 實踐項目(三)
※包裝類、數組、string類淺析及練習
※Hadoop源碼系列(一)FairScheduler申請和分配container的過程
※Android系統——輸入系統(十五)實戰 使用GlobalKey一鍵啟動程序
※MySql單表最大8000W+ 之資料庫遇瓶頸記
TAG:達人科技 |
※一張圖告訴你什麼是智能工廠!
※為什麼玻璃工廠不能停工?停了又會怎樣?看完真是漲知識了
※工廠的伙食到底怎麼樣,幾張圖片告訴你,還真心可以
※特斯拉被起訴員工回應潛入工廠搞破壞:我不是我沒有別瞎說啊!
※未來的工廠應該是個什麼樣子?
※為什麼有的工廠賠錢還要繼續幹下去?工廠老闆訴說真相,很現實!
※世界最「奇葩」工廠,員工上班需要穿紙尿褲,這是怎麼回事?
※為什麼現在,越來越多的越南工廠被迫倒閉呢?答案並不是你想的那樣
※身體的「大工廠」若出了問題,手指會告訴你,不信就看你的中指
※現在的工廠為什麼越來越難招工了?看完後我再也不去工廠了
※多蘭地服裝告訴你:褲子加工廠都做些什麼?
※你們工廠有多少料箱?你是怎麼給它們洗澡的?
※為什麼現在的工廠招工那麼難?原因很無奈
※瞧瞧這些工廠車間,再看看自己,你憑什麼做不到?
※這才是工廠的「質量管理」,你那隻叫瞎管……
※蘋果手機為什麼敢找代工廠?不怕機密泄露嗎?答案說出來你都不信
※富士康到底是良心工廠還是血汗工廠?來看看這些一線員工怎麼說吧
※羅永浩再被打臉,代工廠不想接單,工作站這次被革命了
※那些不願在工廠上班,選擇回老家的人,為什麼最後都回到了工廠?
※工廠搬遷男子嫌路遠辭職不幹,想要賠償被拒將工廠告上法庭後勝訴