C# 工厂模式 个人基本流程

有个前提

本文并不会介绍工厂模式,只是记录在实际当中个人比较喜欢的工厂写法。仅仅作为备忘和参考。

开始流程

定义一个抽象类,包含一些公共的业务逻辑(也可以是接口)

/// <summary>
/// 业务的基类,包含一些公共的业务逻辑
/// </summary>
abstract class BaseClass
{
    protected BaseClass() { }

    public virtual void Print()
    {
        throw new InvalidOperationException();
    }
}

 然后定义一个具体业务

class ClassA:BaseClass
{
    public override void Print()
    {
        Console.WriteLine("233333333333");
    }
}

写一个枚举,包含很多业务分类

enum MyEnum
{
    // 主要编写一些具体的业务参数,传递这个就可以找到对应的业务
    A,
    B
}

 写一个工厂接口,包括枚举和创建返回

interface IFactoryHandler
{
    MyEnum TypEnum { get; }

    BaseClass Create();
}

写一个用到这个工厂接口的类,用于创建具体业务

class A : IFactoryHandler
{
    public MyEnum TypEnum { get; } = MyEnum.A;
    public BaseClass Create()
    {
        return new ClassA();
    }
}

最后利用反射方法,把枚举和具体业务一一对应

public class Factory
{
    //反射到所有用到这个接口的类
    private Factory()
    {
        var type = typeof(IFactoryHandler);
        var instances = from t in Assembly.GetExecutingAssembly().GetTypes()
            where t.GetInterfaces().Contains(type)
            select Activator.CreateInstance(t) as IFactoryHandler;
        FactoryList = instances.ToArray();
    }

    private IFactoryHandler[] FactoryList { get; }

    public BaseClass Create(MyEnum type)
    {
        try
        {
            var factoryHandler = FactoryList.Single(x => x.TypEnum == type).Create();
            return factoryHandler;
        }
        catch (Exception e)
        {
            throw new InvalidOperationException("无效的操作,工厂和参数不匹配", e);
        }
    }
}

白嫖链接

https://github.com/yinghualuowu/SakuraStuffPack/tree/master/SakuraStuffPack/SakuraStuffPack/Factory

 

posted @ 2020-04-07 00:01  樱花落舞  阅读(445)  评论(1编辑  收藏  举报