Design patterns 为什么我们需要抽象的工厂设计模式?
大多数定义都说: 抽象工厂提供了一个 用于创建族的接口 相关对象而不指定 他们的具体课程 抽象工厂模式的用途是什么,因为我们可以通过创建具体类本身的对象来完成任务。为什么我们有一个工厂方法来创建具体类的对象Design patterns 为什么我们需要抽象的工厂设计模式?,design-patterns,abstract-factory,Design Patterns,Abstract Factory,大多数定义都说: 抽象工厂提供了一个 用于创建族的接口 相关对象而不指定 他们的具体课程 抽象工厂模式的用途是什么,因为我们可以通过创建具体类本身的对象来完成任务。为什么我们有一个工厂方法来创建具体类的对象 请提供任何我必须实现abstractFactory模式的实际示例 如果你看一下设计模式,几乎所有的模式都是多余的。但什么样的模式意味着解决类似问题的常用方法呢。设计模式为一组类似类型的设计问题提供了设计级别的方法或解决方案。使用设计模式可以帮助您解决问题,从而更快地交付。如果我理解正确,问题
请提供任何我必须实现abstractFactory模式的实际示例 如果你看一下设计模式,几乎所有的模式都是多余的。但什么样的模式意味着解决类似问题的常用方法呢。设计模式为一组类似类型的设计问题提供了设计级别的方法或解决方案。使用设计模式可以帮助您解决问题,从而更快地交付。如果我理解正确,问题是,为什么我们同时拥有工厂方法和抽象工厂模式。 当不同的多态类有不同的实例化过程时,您需要抽象工厂。您希望一些模块创建实例并使用它们,而不知道对象初始化的任何细节。 例如,您希望创建Java对象来进行一些计算。但其中一些是应用程序的一部分,而另一些的字节码应该从数据库中读取。
另一方面,为什么我们需要工厂方法?同意,抽象工厂与之重叠。但在某些情况下,编写的代码要少得多,类和接口更少,系统更容易理解。抽象工厂是依赖注入(DI)的一种非常核心的设计模式。下面是一个堆栈溢出问题列表,其中抽象工厂的应用已被接受为解决方案 据我所知,这些问题代表了人们真正关心或遇到的问题,因此你应该从一些现实生活的例子开始:
- 使用抽象工厂模式的一个实际示例是提供对两个不同数据源的数据访问。假设您的应用程序支持不同的数据存储。(例如,SQL数据库和XML文件)。您有两个不同的数据访问接口,例如
IReadableStore
和IWritableStore
定义应用程序所需的常用方法,而不考虑使用的数据源类型
应使用哪种类型的数据源不应改变客户端代码检索其数据访问类的方式。您的AbstractDataAccessFactory
知道配置了哪种类型的数据源,并为客户端代码提供了一个具体的工厂,即SqlDataAccessFactory
或XmlDataAccessFactory
。这些具体工厂可以创建具体的实现,例如SqlReadableStore
和SqlWriteableStore
NET框架就是这种模式的一个例子。很简单,如果您有一个与抽象一起工作的代码,那么您应该创建抽象,而不是具体的类 您应该始终反对抽象,因为您可以更好地修改代码 这是一个很好的例子:
我发现抽象工厂模式被高估了 首先,要实例化一组相互关联的类型的情况并不常见 其次,当使用依赖注入时,接口提供的间接(抽象)级别通常就足够了
WindowsGui与MacGui与。。。如果有WindowsButton、MacButton、WindowsScrollBar、MacScrollbar等,通常通过定义具体的按钮、滚动条等更容易实现。使用访问者和/或解释器模式提供实际行为。要直接回答您的问题,您可能不需要使用这种设计模式 但是请记住,现实世界中的大多数项目都在不断发展,您希望提供某种可扩展性,以便使您的项目能够经得起未来的考验
根据我自己的经验,大多数情况下,工厂是实现的,随着项目的发展,工厂会变成更复杂的设计模式,如抽象工厂。抽象工厂非常适合支持多个平台,同时保持代码库的统一。假设您有一个想要在Windows、Linux和OSX上运行的大型Qt或GTK+或.NET/Mono程序。但是您有一个功能,在每个平台上以不同的方式实现(可能通过kernel32api或POSIX功能) 有了这个抽象工厂,您的UI不需要了解任何关于当前平台的信息
Feature feature = Feature.PlatformFeature;
Console.WriteLine(feature.PlatformSpecificValue);
这都是关于依赖性的。如果您不关心紧耦合和依赖性,那么您就不需要抽象工厂。但是,一旦你编写了一个需要维护的应用程序,它就很重要了 假设您创建了一个.jar,其他人使用了您的jar,并希望在您的代码中使用一个新的具体对象。如果您不使用抽象工厂,则她必须修改您的代码或覆盖您的代码。但如果您使用的是抽象工厂,那么她可以提供一个工厂并传递给您的代码,一切都很好 精装版: 考虑一下贝娄的场景: 其他人写了一个框架。该框架使用一个抽象工厂和一些具体工厂在运行时创建大量对象。因此,您可以轻松地将自己的工厂注册到现有框架中,并创建自己的对象。由于抽象的工厂模式,该框架易于修改和扩展 抽象工厂模式的用途是什么,因为我们可以通过创建具体类本身的对象来完成任务。为什么我们有一个工厂方法来创建Concr对象
Feature feature = Feature.PlatformFeature;
Console.WriteLine(feature.PlatformSpecificValue);
DataTable allProvidersTable = DbProviderFactories.GetFactoryClasses();
/* Getting SqlClient family members */
DbProviderFactory dbProviderFactory = DbProviderFactories.GetFactory("System.Data.SqlClient");
DbCommand dbCommand = dbProviderFactory.CreateCommand();
DbConnection dbConnection = dbProviderFactory.CreateConnection();
DbDataAdapter dbDataAdapter = dbProviderFactory.CreateDataAdapter();
SqlClientFactory sqlClientFactory = (SqlClientFactory)dbProviderFactory;
SqlConnection sqlConnection = (SqlConnection)dbConnection;
SqlCommand sqlCommand = (SqlCommand) dbCommand;
SqlDataAdapter sqlDataAdapter = (SqlDataAdapter) dbDataAdapter;
/* Getting OracleClient family members*/
dbProviderFactory = DbProviderFactories.GetFactory("System.Data.OracleClient");
dbCommand = dbProviderFactory.CreateCommand();
dbConnection = dbProviderFactory.CreateConnection();
dbDataAdapter = dbProviderFactory.CreateDataAdapter();
OracleClientFactory oracleClientFactory = (OracleClientFactory)dbProviderFactory;
OracleConnection oracleConnection = (OracleConnection)dbConnection;
OracleCommand oracleCommand = (OracleCommand)dbCommand;
OracleDataAdapter oracleDataAdapter = (OracleDataAdapter)dbDataAdapter;
public class FurnitureProviderFactory
{
public static IFurnitureFactory GetFactory(string furnitureType)
{
if (furnitureType == "Wood")
{
return new WoodenFurnitureFactory();
}
if (furnitureType == "Plastic")
{
return new PlasticFurnitureFactory();
}
throw new Exception("Undefined Furniture");
}
}