大多数定义都说:
抽象工厂提供了一个接口,用于创建相关对象家族,而不指定它们的具体类
抽象工厂模式的作用是什么,既然我们可以通过创建具体类的对象来实现任务?为什么要有一个创建具体类对象的工厂方法?
请给我任何一个必须要实现抽象工厂模式的现实生活例子。
大多数定义都说:
抽象工厂提供了一个接口,用于创建相关对象家族,而不指定它们的具体类
抽象工厂模式的作用是什么,既然我们可以通过创建具体类的对象来实现任务?为什么要有一个创建具体类对象的工厂方法?
请给我任何一个必须要实现抽象工厂模式的现实生活例子。
抽象工厂是一种非常核心的设计模式,用于依赖注入
(DI)。下面是一些在Stack Overflow中应用抽象工厂被接受作为解决方案的问题列表。
据我所知,这些问题代表了人们真正关心或遇到的问题,因此这应该可以帮助你了解一些实际的例子:
IReadableStore
和 IWritableStore
,定义了应用程序期望的通用方法,无论使用何种类型的数据源。AbstractDataAccessFactory
知道配置了哪种类型的数据源,并为客户端代码提供一个具体工厂,即 SqlDataAccessFactory
或 XmlDataAccessFactory
。这些具体工厂可以创建具体实现,例如 SqlReadableStore
和 SqlWriteableStore
。您可以从这篇 sourcemaking 文章中了解到 抽象工厂 模式的意图、结构、检查清单和经验法则。
检查清单:
抽象工厂对于支持多个平台且统一代码库非常有用。假设您有一个大的Qt或GTK+或.NET/Mono程序,想在Windows、Linux和OSX上运行。但是您有一个功能在每个平台上都以不同的方式实现(可能通过kernel32 API或POSIX功能)。
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);
IT技术相关内容的翻译如下:
很容易理解,如果你有一个使用抽象方法的代码,就应该创建抽象类而不是具体类。
因为你可以更好地修改代码,所以总是要使用抽象方法进行工作。
以下是一个很好的例子: http://en.wikipedia.org/wiki/Abstract_factory_pattern#C.23
抽象工厂或任何其他工厂,它们的存在都是为了解决同一个问题,即“对象创建的抽象化”。
通常它会抽象出以下内容:
if
条件来决定要实例化哪个对象。new
运算符,实例化一个对象。工厂的责任就是这么简单。
您可以查看此处以获取详细说明。
如果你看一下设计模式,几乎所有的模式都可以被替代。但是,模式意味着一种常用的解决类似问题的方法。设计模式为一组相似的设计问题提供了一种设计层面的方法或解决方案。使用设计模式可以帮助你解决问题,从而更快地交付。
我认为抽象工厂模式被高估了。
首先,你很少有一组需要实例化的相互关联的类型。
其次,在使用依赖注入时,接口提供的间接性(抽象)通常已经足够。
WindowsGui vs MacGui等典型示例,你可以通过定义具体的按钮、滚动条等,使用访问者和/或解释器模式来提供实际行为,这通常更容易实现。