/// <summary>
/// 工廠模式
/// 工廠模式是將對象的創建與上游使用方,進行分離。通過factory對象來創建。
/// 通過factory對象來創建,通過配置信息,進行創建對象,就是工廠根據採購清單生產商品一樣
/// 1.通過配置文件來配置對象信息。
/// 2.通過配置信息+反射來進行對象的創建。
/// 3.上游對象不需要關心對象的創建過程。
/// </summary>
class Program
{
static void Main(string[] args)
{
///1.直接創建對象方式
///對象創建在上游[主程序]已經確定,不能進行分離。
InitMethods1();
///2.通過工廠對象創建對象
InitFactory();
Console.Read();
}
private static void InitFactory()
{
IAnimal animal = ObjectFactory.CreateInit<IAnimal>();
animal.Sleep();
}
private static void InitMethods1()
{
IAnimal cat = new Cat();
IAnimal dog = new Dog();
cat.Sleep();
dog.Sleep();
}
}
創建動物(IAnimal)接口:
public interface IAnimal
{
void Sleep();
}
創建貓類(Cat),繼承IAnimal
public class Cat : IAnimal
{
public void Sleep()
{
Console.WriteLine("當前對象{0}",this.GetType());
}
}
創建dog類,繼承Ianimal
public class Dog : IAnimal
{
public void Sleep()
{
Console.WriteLine("當前對象{0}",this.GetType());
}
}
ObjectFactry對象,用於根據XML配置信息創建對象
class ObjectFactory
{
/// <summary>
/// 通過工廠對象創建對象
/// </summary>
/// <returns>當前實例對象</returns>
static string config = ConfigurationManager.ConnectionStrings["factoryConfig"].ConnectionString;
public static T CreateInit<T>()
{
try
{
string dllName = config.Split(',')[0];
string className = config.Split(',')[1];
Assembly assembly = Assembly.Load(dllName);
Type type = assembly.GetType(className);
return (T) Activator.CreateInstance(type);
}
catch (Exception)
{
throw new Exception("Class Exception");
}
}
}
XML:
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" />
</startup>
<connectionStrings>
<add name="factoryConfig" connectionString="FactoryLibrary,Factory.Cat"/>
<add name="factoryConfig1" connectionString="FactoryLibrary,Factory.Dog"/>
<!---->
</connectionStrings>
</configuration>
運行結果如下圖:
如果將XML配置文件修改爲<add name="factoryConfig" connectionString="FactoryLibrary,Factory.Dog"/>,運行結果如下: