1.为什么要用工厂模式
为了遵循依赖倒置原则:上层模块不应该依赖下层模块,二者应该通过抽象来依赖,即依赖抽象,不依赖细节。
2.工厂模式实现
2.1简单工厂模式
简单工厂:创建一个工厂来实例化类,没有消除依赖,只是转移了依赖,并集中了依赖。(简单工厂不属于23中设计模式,因为太简单了?)
实现代码如下:
public class PhoneFactory
{
public static IPhone CreateInstance(PhoneType phoneType)
{
IPhone phone = null;
switch (phoneType)
{
case PhoneType.ApplePhone:
phone = new ApplePhone();
break;
case PhoneType.MiPhone:
phone = new MiPhone();
break;
case PhoneType.HuaweiPhone:
phone = new HuaweiPhone();
break;
default:
throw new Exception("phoneType error");
//break;
}
return phone;
}
public enum PhoneType
{
ApplePhone,
MiPhone,
HuaweiPhone
}
}
2.2简单工厂+配置文件
为了解决从前端传递参数的问题,将参数保存在配置文件
配置文件如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<appSettings>
<add key="PhoneType" value="ApplePhone"/>
</appSettings>
</configuration>
实现代码如下:
private static string phoneType = ConfigurationManager.AppSettings["PhoneType"];
public static IPhone CreateInstanceConfig()
{
PhoneType type = (PhoneType)Enum.Parse(typeof(PhoneType), phoneType);
return CreateInstance(type);
}
2.3简单工厂+配置文件+反射
配置文件如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<appSettings>
<add key="ObjectReflection" value="Joont.Phone.Service.MiPhone,Joont.Phone.Service"/>
</appSettings>
</configuration>
实现代码如下:
private static string phoneTypeReflect = ConfigurationManager.AppSettings["ObjectReflection"];
public static IPhone CreateInstanceConfigReflection()
{
Assembly assembly = Assembly.Load(phoneTypeReflect.Split(',')[1]);
Type type = assembly.GetType(phoneTypeReflect.Split(',')[0]);
return (IPhone)Activator.CreateInstance(type);
}
2.3简单工厂+配置文件+反射+泛型
配置文件如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<appSettings>
<add key="ObjectReflection_IPhone" value="Joont.Phone.Service.MiPhone,Joont.Phone.Service"/>
</appSettings>
</configuration>
实现代码如下:
public static T CreateInstanceConfigReflectionGeneric<T>()
{
string configKey = string.Format("ObjectReflection_{0}", typeof(T).Name);
string objectReflectGeneric = ConfigurationManager.AppSettings[configKey];
Assembly assembly = Assembly.Load(objectReflectGeneric.Split(',')[1]);
Type type = assembly.GetType(objectReflectGeneric.Split(',')[0]);
return (T)Activator.CreateInstance(type);
}
以上便是简单工厂的集中实现方式。
总结一下:
优点:将上层对底层的依赖转移到第三方,保持上层的稳定,遵循依赖倒置原则。
缺点:工厂的职责过多,工厂不稳定