【问题标题】:Do I need a factory with an abstract factory in this scenario?在这种情况下,我需要一个带有抽象工厂的工厂吗?
【发布时间】:2017-11-01 00:05:10
【问题描述】:

抱歉,如果有人已经问过这个问题,但我没有找到与此特定场景相关的问题:

我有一个具有状态和类型的实体。对于每种状态和每种类型,我都应该向用户显示一个不同的页面,并且该页面的创建有些复杂,因此它是使用构建器模式创建的。但是,在某些情况下,这些页面可能是相同的。并且有一些状态,我不需要检查类型。

可能出现的一些例子:

  • 任何类型的状态 1 -> 页面“1”
  • 类型 A 的状态 2 -> 页面“2A”
  • 类型 B 的状态 2 -> 页面“2B”
  • 类型 A 的状态 3 -> 页面“3X”
  • 类型 B 的状态 3 -> 页面“3X”
  • 类型 C 的状态 3 -> 页面“3C”

我考虑过实现一个工厂(每个状态都有一个 switch case),它将创建并返回一个抽象工厂的结果(每个类型都有一个工厂)。但是,我需要一些抽象类来解决这些工厂之间的“同一页面”问题。

我真的需要这种复杂的结构吗?

【问题讨论】:

    标签: design-patterns factory-pattern abstract-factory


    【解决方案1】:

    您想根据类型的不同状态显示页面。因此,您的内部页面调用将根据您的上下文而改变。因此,我建议您使用 Strategy Design Pattern 来实现此行为。

    根据我对您的问题陈述的理解,下面的 C# 代码实现:

    public interface ISomeOperation
    {
        string DisplayPage(int status);
    }
    
    public class Type : ISomeOperation
    {
        public string DisplayPage(int status)
        {
            if (status == 1)
                return "1";
            return string.Empty;
        }
    }
    
    public class TypeA : ISomeOperation
    {
        public string DisplayPage(int status)
        {
            if (status == 2)
                return "2A";
            if (status == 3)
                return "3A";
            if (status == 4)
                return "4A";
            return string.Empty;
        }
    }
    
     public class TypeB: ISomeOperation
    {
        public string DisplayPage(int status)
        {
            if (status == 2)
                return "2B";
            if (status == 3)
                return "3B";
            if (status == 4)
                return "4B";
            return string.Empty;
        }
    }
    
    public class TypeC : ISomeOperation
    {
        public string DisplayPage(int status)
        {
            if (status == 2)
                return "2C";
            if (status == 3)
                return "3C";
            if (status == 4)
                return "4C";
            return string.Empty;
        }
    }
    
     public class OperationContext
    {
        private readonly ISomeOperation _iSomeOperation;
    
        public OperationContext(ISomeOperation someOperation)
        {
            _iSomeOperation = someOperation;
        }
    
        public string DisplayPageResult(int status)
        {
            return _iSomeOperation.DisplayPage(status);
        }
    }
    

    驱动代码:

     class Program
    {
        static void Main(string[] args)
        {
            var operationContext = new OperationContext(new Type());
            operationContext.DisplayPageResult(1);
    
             operationContext = new OperationContext(new TypeB());
            operationContext.DisplayPageResult(2);
            operationContext.DisplayPageResult(3);
            operationContext.DisplayPageResult(4);
    
            operationContext = new OperationContext(new TypeC());
            operationContext.DisplayPageResult(2);
            operationContext.DisplayPageResult(3);
            operationContext.DisplayPageResult(4);
        }
    }
    

    【讨论】:

      【解决方案2】:

      您的问题陈述要求看起来是创建 页面,因此 策略 可能不太适合(它关于没有状态更改的算法系列)。如果页面的类型是有限的,static FactoryPrototype(以防您需要克隆每个页面实例)将更适合(有两个键可供选择)。

      【讨论】:

        猜你喜欢
        • 2011-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-05
        • 2014-01-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多