需求:工廠類根據參數生成對應類的實例。
示例:
RoomParts.cs
namespace ReflectionFactory
{
/// <summary>
/// 屋子產品的零件
/// </summary>
public enum RoomParts
{
Roof,
Window,
Pillar
}
}
ProductAttribute.cs
using System;
namespace ReflectionFactory
{
/// <summary>
/// 這個特性用來附加在產品類型之上,
/// 來標注該類型代表哪個產品,方便反射使用
/// </summary>
public class ProductAttribute : Attribute
{
/// <summary>
/// 標注零件的成員
/// </summary>
private RoomParts _myRoomPart;
public ProductAttribute(RoomParts part)
{
_myRoomPart = part;
}
public RoomParts RoomPart
{
get
{
return _myRoomPart;
}
}
}
}
ProductListAttribute.cs
using System;
namespace ReflectionFactory
{
/// <summary>
/// 這個特性用來附加在產品接口之上
/// 用來標注一共實現了多少產品零件,方便反射使用
/// </summary>
public class ProductListAttribute : Attribute
{
/// <summary>
/// 產品類型集合
/// </summary>
private Type[] _myList;
public ProductListAttribute(Type[] products)
{
_myList = products;
}
public Type[] ProductList
{
get
{
return _myList;
}
}
}
}
IProduct.cs
using System;
namespace ReflectionFactory
{
/// <summary>
/// 產品零件接口,
/// 需要添加所有實現該接口的列表
/// </summary>
[ProductList(new Type[] { typeof(Roof), typeof(Window), typeof(Pillar) })]
public interface IProduct
{
string GetName();
}
}
Roof.cs
namespace ReflectionFactory
{
/// <summary>
/// 屋頂類型
/// </summary>
[Product(RoomParts.Roof)]
public class Roof : IProduct
{
public string GetName()
{
return "屋頂";
}
}
}
Window.cs
namespace ReflectionFactory
{
/// <summary>
/// 窗戶類型
/// </summary>
[Product(RoomParts.Window)]
public class Window : IProduct
{
public string GetName()
{
return "窗戶";
}
}
}
Pillar.cs
namespace ReflectionFactory
{
/// <summary>
/// 柱子類型
/// </summary>
[Product(RoomParts.Pillar)]
public class Pillar : IProduct
{
public string GetName()
{
return "柱子";
}
}
}
IFactory.cs
namespace ReflectionFactory
{
public interface IFactory
{
IProduct Produce(RoomParts part);
}
}
Factory.cs
using System;
using System.Reflection;
namespace ReflectionFactory
{
/// <summary>
/// 工廠類型
/// </summary>
public class Factory : IFactory
{
public IProduct Produce(RoomParts part)
{
// 通過反射,從IProduct接口獲得屬性
// 從而獲得所有的產品零件列表
ProductListAttribute attr = Attribute.GetCustomAttribute(typeof(IProduct),
typeof(ProductListAttribute)) as ProductListAttribute;
// 遍歷所有的實現產品零件類型
foreach (Type type in attr.ProductList)
{
// 利用發射查找其屬性
ProductAttribute pa = Attribute.GetCustomAttribute(type,
typeof(ProductAttribute)) as ProductAttribute;
// 確定是否是需要的零件
if (pa.RoomPart == part)
{
// 利用反射創建產品零件類型
Object product = Assembly.GetExecutingAssembly().CreateInstance(type.FullName);
return product as IProduct;
}
}
return null;
}
}
}
FactoryManager.cs
using System;
namespace ReflectionFactory
{
/// <summary>
/// 工廠管理類型
/// </summary>
public class FactoryManager
{
public static IProduct GetProduct(RoomParts part)
{
// 一共只有一個工廠,不再需要根據產品類型而挑選工廠
Factory factory = new Factory();
IProduct product = factory.Produce(part);
Console.WriteLine("生產了一個產品:" + product.GetName());
return product;
}
}
}
Program.cs
using System;
namespace ReflectionFactory
{
class Program
{
static void Main(string[] args)
{
// output : 生產了一個產品:柱子
IProduct pillar = FactoryManager.GetProduct(RoomParts.Pillar);
// output : 生產了一個產品:屋頂
IProduct roof = FactoryManager.GetProduct(RoomParts.Roof);
// output : 生產了一個產品:窗戶
IProduct window = FactoryManager.GetProduct(RoomParts.Window);
Console.Read();
}
}
}