c# - 具有通用功能的方法的工厂模式

标签 c# design-patterns abstract-factory

我有几个与模式相关的问题,如果你们能提供帮助,那就太好了。
我在下面有一个工厂模式代码的示例(代码在底部)-
我的问题是 -

  • 问题 1.
  • 例如,如果我需要为 IPeople 实现常见功能怎么办 -

    bool GotLegs()
    {
        return true; //Always returns true for both People types
    }
    

    因此,如果我想为村民和城市人实现这种通用方法,是否还有另一种模式可以实现?

  • 问题2
  • 有没有办法可以直接创建 IPeople 类型,而不是实例化对象。例如 -

    IPeople people = Factory.GetPeople(PeopleType.URBAN);
    

    我知道静态不是接口(interface)的一个选项,但只是检查是否有出路。

    实际 C# 控制台引用代码 -

    //Main Prog
    class Program
    {
        static void Main(string[] args)
        {
            Factory fact = new Factory();
            IPeople people = fact.GetPeople(PeopleType.URBAN);
        }
    }
    
    //Empty vocabulary of Actual object
    public interface IPeople
    {
        string GetName();
    }
    
    public class Villagers : IPeople
    {
    
        #region IPeople Members
    
        public string GetName()
        {
            return "Village Guy";
        }
    
        #endregion
    }
    
    public class CityPeople : IPeople
    {
    
        #region IPeople Members
    
        public string GetName()
        {
            return "City Guy";
        }
    
        #endregion
    }
    
    public enum PeopleType
    {
        RURAL,
        URBAN
    }
    
    /// <summary>
    /// Implementation of Factory - Used to create objects
    /// </summary>
    public class Factory
    {
        public IPeople GetPeople(PeopleType type)
        {
            IPeople people = null;
            switch (type)
            {
                case PeopleType.RURAL:
                    people = new Villagers();
                    break;
                case PeopleType.URBAN:
                    people = new CityPeople();
                    break;
                default:
                    break;
            }
            return people;
        }
    }
    

    最佳答案

    问题 1:

    有几个选项:

    1. 使 GotLegs 成为 IPerson 的扩展方法:

      public static class PersonExtensions
      {
          public static bool GotLegs(this IPerson person)
          {
              return true;
          }
      }
      

      在这种情况下,IPerson 不应定义 GotLegs 本身。

    2. GotLegs 添加到 IPerson 接口(interface),并创建一个实现此方法的基类 PersonBase 并创建 CityPeopleVillagers 派生自该基类。

    问题2:

    简单地使 GetPeopleFactory 静态:

    public static class Factory
    {
        public static IPeople GetPeople(PeopleType type)
        {
            ...
        }
    }
    

    用法正如您所展示的那样:

    IPeople people = Factory.GetPeople(PeopleType.URBAN);
    

    关于c# - 具有通用功能的方法的工厂模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16240398/

    相关文章:

    c# - 地理坐标转换器

    c# - 防止无效的文本框输入绑定(bind)到业务对象属性?

    ninject - 是否可以将 Ninject Factory Extensions 的 ToFactory 方法与开放泛型一起使用?

    c# - 使用 DI/抽象工厂模式时的依赖关系处理

    c# - 尝试访问 wcf 服务时,契约(Contract)为 'IService1' 的 ServiceEndpoint 上的 CustomBinding 缺少 TransportBindingElement 错误

    c# - 如何警告 Console.Write() 中的错误参数编号?

    java - 将所有 GUI 组件注册为观察者或将当前对象作为构造函数参数传递给下一个对象?

    Javascript 门面模式从不显示初始设置

    java - 在设计类似记录器的类时处理条件语句?

    design-patterns - 抽象工厂和构建器之间的区别?