傳統 Factory Method 每個具體產品需對應一個工廠類,產品增多導致工廠管理困難。TypedFactory Facility 讓我們僅定義工廠介面,容器自動實現。資訊:
| 屬性 | 值 |
|---|---|
| Uses Proxy | Yes |
| Requires Configuration | Yes |
| Uses Attributes | No |
| Version | Beta 2 |
public interface IProduct { void Display(); }
public class ConcreteProductA : IProduct { public void Display() => Console.WriteLine("ConcreteProductA"); }
public class ConcreteProductB : IProduct { public void Display() => Console.WriteLine("ConcreteProductB"); }
public class ConcreteProductC : IProduct { public void Display() => Console.WriteLine("ConcreteProductC"); }
public interface IFactory
{
IProduct Create(string id);
void Release(IProduct handler);
}
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<facilities>
<facility id="typedfactory">
<factories>
<factory id="factory" interface="TypedFactoryFacilityDemo.IFactory, TypedFactoryFacilityDemo"
creation="Create" destruction="Release" />
</factories>
</facility>
</facilities>
</configuration>
public class App
{
public static void Main()
{
IWindsorContainer container = new WindsorContainer(new XmlInterpreter("../../MyConfig.xml"));
container.AddFacility("typedfactory", new TypedFactoryFacility());
container.AddComponent("proda", typeof(IProduct), typeof(ConcreteProductA));
container.AddComponent("prodb", typeof(IProduct), typeof(ConcreteProductB));
container.AddComponent("prodc", typeof(IProduct), typeof(ConcreteProductC));
IFactory factory = (IFactory)container["factory"]; // Key 為 factory 元素的 id
IProduct pa = factory.Create("proda"); pa.Display();
IProduct pb = factory.Create("prodb"); pb.Display();
IProduct pc = factory.Create("prodc"); pc.Display();
Console.ReadLine();
}
}
全程零工廠實現類,新增產品只需註冊新組件。注意:解析工廠時的 Key 是配置中 <factory id="..."> 的 id,非 Facility id。下篇將解析原理。