• 【23种设计模式】工厂方法模式(Factory Method Pattern) .Net Core实现


    简介

    工厂方法(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() 接口是通过Singleton方式注入。
    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);
    	}
    }
    

    来源

    .Net Core 中使用工厂模式
    工厂模式在.NETCore项目中的应用

  • 相关阅读:
    使用责任链模式实现登录风险控制
    【小程序自动化Minium】二、元素定位-Page接口中的 get_element() 与 get_elements()
    【企业动态】复工啦,回顾2023,展望2024!东胜物联与您同启新程
    web网页设计与开发:基于HTML+CSS+JavaScript简单的个人博客网页制作期末作业
    【Linux】在 Ubuntu 系统下使用 Screen 运行 Python 脚本
    看红帽巨佬解析⭐《一、G1垃圾回收期简介》⭐
    【TCP】延时应答 与 捎带应答
    感受 OpenDNS
    Deployment应用生命周期与Pod健康检查
    HTML1:html基础
  • 原文地址:https://blog.csdn.net/weixin_44231544/article/details/126865732