为什么我们需要抽象工厂devise模式?
大部分的定义是:
抽象工厂提供了一个创build相关对象族的界面,而不需要指定具体的类
什么是抽象工厂模式的使用,因为我们可以通过创build具体类本身的对象来实现任务。 为什么我们有一个创build具体类的对象的工厂方法?
请给我提供我必须实现abstractFactory模式的真实例子吗?
抽象工厂是dependency injection (DI)的一个非常中心的devise模式。 下面是一个Stack Overflow问题列表,其中Abstract Factory的应用已经被接受为解决scheme。
据我所知,这些问题代表了人们真正关心的问题,所以应该让你开始一些真实的例子:
- 是否有初始化通过DI容器创build的对象的模式
- 不能合并工厂/ DI
- WCFdependency injection和抽象工厂
- 如何在关键类需要Session时(或其他特定于上下文的variables)设置IoC
- 如何根据最终用户configuration值来parsingtypes?
- 策略模式和使用Unity的dependency injection
- 在IoC顶部的抽象工厂模式?
- 这是使用和testing使用工厂模式的类的正确方法吗?
- DDD书籍,埃里克·埃文斯:请解释“工厂应该抽象为所需types而不是具体的类创build的意思”。
- DI容器,工厂还是新的临时对象?
- 如何unit testing实例创build?
- 用户inputdependency injection的最佳策略是什么?
使用抽象工厂模式的一个实际例子是提供对两个不同数据源(例如SQL数据库和XML文件)的数据访问。 您有两个不同的数据访问类(数据存储的网关)。 两者都从定义要实现的常用方法的基类(例如,加载,保存,删除)inheritance。
应使用哪个数据源不应改变客户端代码检索其数据访问类的方式。 您的抽象工厂知道应使用哪个数据源,并根据请求返回适当的实例。 工厂返回这个实例作为基类的types。
如果我理解你是正确的 – 问题是,为什么我们同时拥有Factory方法和抽象工厂模式。 当不同的多态类具有不同的实例化过程时,您需要抽象工厂。 而且你想要一些模块来创build实例并使用它们,而不需要知道任何对象初始化的细节。 例如 – 你想创build一些计算Java对象。 但其中一些是应用程序的一部分,而其他的字节码应该从数据库中读取。 另一方面,为什么我们需要工厂方法? 同意,抽象工厂重叠它。 但是在某些情况下 – 编写代码要less得多,只需要更less的类和接口就可以使系统更容易理解。
什么是抽象工厂模式的使用,因为我们可以通过创build具体类本身的对象来实现任务。 为什么我们有一个创build具体类的对象的工厂方法?
在没有抽象工厂的情况下,客户需要知道具体的类的细节。 这个紧密的耦合已经被Abstract Factory删除了。
现在, 工厂方法暴露了一个客户必须使用的合同。 您可以添加更多的产品到您的工厂,通过添加新的产品,实现工厂方法暴露的接口。
请参阅这些相关的SE问题以获得更好的理解:
工厂和抽象工厂模式之间的基本区别是什么?
意图:
提供一个接口来创build相关或依赖对象的族,而不指定它们的具体类。
您可以从该源文件中了解抽象工厂模式的意图,结构,清单和经验规则 。
清单:
- 决定平台独立性和创造性服务是否是目前的痛苦根源。
- 绘制一个平台与产品的matrix。
- 定义一个由每个产品的工厂方法组成的工厂界面 。
- 为每个平台定义一个工厂派生类,它封装了对新操作符的所有引用。
- 客户端应将所有引用都废弃,并使用工厂方法创build产品对象。
抽象工厂非常适合支持多种平台,同时保持您的代码库统一。 假设你有一个大的Qt或GTK +或.NET / Mono程序,你想在Windows,Linux和OSX上运行。 但是你有一个在每个平台上以不同方式实现的function(可能通过kernel32 API或POSIXfunction)。
public abstract class Feature { public abstract int PlatformSpecificValue { get; } public static Feature PlatformFeature { get { string platform; // do platform detection here if (platform == "Win32") return new Win32Feature(); if (platform == "POSIX") return new POSIXFeature(); } } // platform overrides omitted }
有了这个抽象工厂,您的用户界面不需要知道关于当前平台的任何信息。
Feature feature = Feature.PlatformFeature; Console.WriteLine(feature.PlatformSpecificValue);
如果你看一下devise模式,几乎所有的devise模式都可以被重复使用。 但是什么模式意味着解决类似问题的常用方法。 devise模式为您提供devise级别的方法或解决scheme,以解决一组类似的devise问题。 使用devise模式可以帮助您解决问题,从而加快交付速度。
它很容易,你有一个与抽象一起工作的代码的图像,你应该创build抽象而不是具体的类。
你应该总是反对抽象,因为你可以更好地修改代码。
这是一个很好的例子: http : //en.wikipedia.org/wiki/Abstract_factory_pattern#C.23
我发现抽象工厂模式被高估了。
首先,经常不会发生你想要实例化的一组相互关联的types。
其次, 接口提供的间接(抽象)级别通常在使用dependency injection时足够了。
WindowsGui vs MacGui VS的典型例子…通过使用Visitor和/或Interpreter模式定义具体的button,滚动条等,您可以更容易地实现WindowsButton,MacButton,WindowsScrollBar,MacScrollbar等。实际行为。
要直接回答你的问题,你可能不用使用这样的devise模式。
但是请记住,现实世界中的大多数项目都在发展,并且您希望提供某种可扩展性,以使您的项目具有前瞻性。
从我自己的经验来看,大多数时候,工厂都是实现的,随着项目的发展,它会变成更复杂的devise模式,比如抽象工厂。
这都是关于依赖关系。 如果你不关心紧耦合和依赖关系,那么你不需要抽象工厂。 但是一旦你写了一个需要维护的应用程序就会很重要。
假设你创build了一个.jar,而其他人使用你的jar,并想在你的代码中使用一个新的具体对象。 如果你不使用抽象工厂,那么她必须修改你的代码或者覆盖你的代码。 但是,如果你使用抽象工厂,那么她可以提供一个工厂,并传递给你的代码,一切都很好。
精炼的版本:考虑下面的情况:其他人写了一个框架。 该框架使用抽象工厂和一些具体工厂在运行时创build大量对象。 因此,您可以轻松地将自己的工厂注册到现有框架并创build自己的对象。 由于抽象工厂模式,该框架被修改并且仍然容易扩展。
当客户端不确切知道要创build什么types时,这种模式特别有用。 举个例子,我们假设一个专门销售手机的陈列室询问三星制造的智能手机。 在这里,我们不知道要创build的对象的确切types(假设手机的所有信息都以具体对象的forms包装)。 但是我们知道我们正在寻找三星生产的智能手机。 如果我们的devise有抽象工厂实现,这个信息实际上可以被利用。
在C#中理解和实现抽象工厂模式