在这种情况下,我是否需要一家带抽象工厂的工厂?

时间:2017-11-01 00:05:11

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

很抱歉,如果有人问过这个问题,但我没有发现这个特定情况的问题:

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

可能出现的一些例子:

  • 任何类型的状态1 - > Page" 1"
  • 类型A的状态2 - > Page" 2A"
  • 类型B的状态2 - > Page" 2B"
  • 状态3,类型A - > Page" 3X"
  • 状态3,类型B - > Page" 3X"
  • 类型C的状态3 - > Page" 3C"

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

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

2 个答案:

答案 0 :(得分:0)

您希望根据Type的不同状态显示页面。因此,您的内部页面调用将根据您的上下文进行更改。因此,我建议您使用策略设计模式实现此行为。

根据我对您的问题陈述的理解,在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);
    }
}

答案 1 :(得分:0)

您的问题陈述要求似乎是页面的创建,因此策略可能不太适合(关于没有状态更改的算法系列)。如果页面类型是有限的,静态工厂原型(如果您需要克隆每个页面实例)将更适合(使用两个键进行选择)。