工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先完全实现‘开-闭 原则’,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。
工厂方法模式对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类和接口),这个类将不再负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。
工厂方法模式(Factory Method pattern)是最典型的模板方法模式(Template Method pattern)应用。
当一个抽象类有多个实现的时候,需要多次实例化的时候,就要考虑使用工厂模式。
比如:登录的抽象类ILoginBusiness,它有2个实现,一个用用户名密码登录,一个用手机号验证码登录
public interface ILoginBusiness
{
Task Login(LoginInputDTO input);
}
public class MobileCodeLogin : ILoginBusiness
{
public Task Login(LoginInputDTO input)
{
// todo
}
}
public class UserNameAndPasswordLogin : ILoginBusiness
{
public Task Login(LoginInputDTO input)
{
// todo
}
}
按照原有方式,我们会根据某个条件去实例化,比如loginType
ILoginBusiness loginBusiness;
if (loginType == 1)
{
loginBusiness = new MobileCodeLogin();
}
else
{
loginBusiness = new UserNameAndPasswordLogin()
}
当有多种实例的话,就需要更多的if else或者switch,工厂模式的作用就是把这种建造对象的方法放在工厂类去解决,统一管理统一维护。
public interface IPhoneFactory
{
///
/// 生产手机
///
///
///
Phone Produce(string color);
}
public class PhoneFactory : IPhoneFactory
{
private readonly PhoneOption _options;
public PhoneFactory(IOptions<PhoneOption> options)
{
_options = options.Value;
}
public Phone Produce(string color)
{
Phone phone;
switch (_options.PhoneType)
{
case EnumPhone.ApplePhone:
phone = new ApplePhone(color);
break;
case EnumPhone.AndroidPhone:
phone = new AndroidPhone(color);
break;
default:
phone = new OtherPhone(color);
break;
}
return phone;
}
}
这里的PhoneOption对应配置文件里的内容,将来只需要修改配置文件参数,就可实现不同实例的切换。
public static class DependencyInjectionExtensions
{
public static IServiceCollection AddCastData(this IServiceCollection service)
{
var Configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.Build();
// 注册服务
service.AddHostedService<CastService>();
service.Configure<PhoneOption>(Configuration.GetSection("Phone"));
service.AddSingleton<IPhoneFactory, PhoneFactory>();
return service;
}
}
这里只需要关心service.AddSingleton
service.Configure(Configuration.GetSection(“Phone”)) 对应配置文件
public class CastService : BackgroundService
{
private readonly IPhoneFactory _phoneFactory;
public CastService(IPhoneFactory phoneFactory)
{
_phoneFactory = phoneFactory;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
Phone phone = _phoneFactory.Produce("远锋蓝色");
System.Console.WriteLine(phone);
}
}