用于创建特定视图元素的设计模式

时间:2015-08-26 21:57:43

标签: oop design-patterns ui-patterns

假设我们有一个抽象工厂,为我们创建了一些产品。我们知道抽象工厂可以为我们提供产品的一些特定子类,但我们不想检查类型(这是此模式的主要原因)。 现在我们需要为每种类型的对象创建一个特定的视图,如何在不知道特定类型的情况下执行此操作? 同一工厂应该创建不同的视图吗?

更新:我创建了一个github repo来尝试所有不同的方法。

1 个答案:

答案 0 :(得分:1)

对于这个问题,我们可以看看在ADO.NET中如何实现抽象工厂模式。

我们有一个名为DbProviderFactory的抽象工厂。这个工厂有几个实现,如SqlClientFactoryMySqlClientFactoryOracleClientFactory等。

对于此问题,产品是与数据库相关的对象,如连接,命令,数据适配器等。

起初我们的抽象工厂为我们提供了一个连接(产品)。它可以是MySqlConnectionOracleConnection。我们唯一知道的是,它是DbConnection

DbProviderFactory factory = ...
DbConnection conn = factory.CreateConnection();

现在我们需要创建一个可以与此连接一起使用的命令对象(视图)。

DbCommand cmd = conn.CreateCommand();

如您所见,命令(视图)由连接(产品)创建,而不是由抽象工厂创建。

但这不是真的......

实际发生的事情隐藏在实施细节中。当抽象工厂创建连接时,它会将自身传递给连接。当我们要求命令时,连接通过提供的抽象工厂创建命令。

所以,如果我们回到你的问题,实现可能是这样的。

interface IView { 
    IProduct Product { get; set; }
    void Render();
}

interface IProduct { 
    IView CreateView();
}

interface IAbstractFactory {
    IProduct CreateProduct();
    IView CreateView();
}

class View1 : IView {
    public IProduct Product { get; set; }

    public void Render() {
        Product1 p1 = (Product1)Product;
        // Do product1 specific rendering here
    }
}

class Product1 : IProduct {
    private IAbstractFactory factory;

    public Product1(IAbstractFactory factory) {
         this.factory = factory;
    }

    public IView CreateView() {
         IView view = factory.CreateView();
         view.Product = this;
         return this;
    }
}

class Factory1 : IAbstractFactory {
    IProduct CreateProduct() {
        return new Product1(this);
    }        

    IView CreateView() {
        return new View1();            
    }        
}