这个问题可能看起来像是重复的,但请耐心等待 - 我保证我已经阅读了相关的帖子(以及GOF书籍)。
在阅读了所有内容后,我仍然不清楚何时使用抽象工厂、工厂方法或构建器。我相信,在看到一个可以明显通过某种模式解决问题的简单例子之后,我会最终明白何时使用 构建器 而不是使用 抽象工厂。
你能提供一个简单的例子,其中你会明确地使用一种模式而不是其他模式吗?
如果示例太简单,那么我理解这可能归结为一种观点,但我希望如果有任何人能够做到这一点,那个人就在SO上。
谢谢。
这个问题可能看起来像是重复的,但请耐心等待 - 我保证我已经阅读了相关的帖子(以及GOF书籍)。
在阅读了所有内容后,我仍然不清楚何时使用抽象工厂、工厂方法或构建器。我相信,在看到一个可以明显通过某种模式解决问题的简单例子之后,我会最终明白何时使用 构建器 而不是使用 抽象工厂。
你能提供一个简单的例子,其中你会明确地使用一种模式而不是其他模式吗?
如果示例太简单,那么我理解这可能归结为一种观点,但我希望如果有任何人能够做到这一点,那个人就在SO上。
谢谢。
StringBuilder
类,它逐步构建最终的字符串。更好的例子是Spring中的UriComponentsBuilder,它帮助你构建一个URI。DbProviderFactory
类,它用于创建与给定数据库提供程序(oracle、sql server等)相关的对象(连接、命令等),具体取决于它的具体实现。构建器
// Builder encapsulates construction of other object. Building of the object can be done in multiple steps (methods)
public class ConfigurationBuilder
{
// Each method adds some configuration part to internally created Configuration object
void AddDbConfiguration(...);
void AddSmtpConfiguration(...);
void AddWebServicesConfiguration(...);
void AddWebServerConfiguration(...);
// Returns built configuration
Configuration GetConfiguration();
}
Factory method
// Factory method is declared in base class or interface. Subclass defines what type is created by factory method.
public interface ICacheProvider
{
ISession CreateCache(); // Don't have to return new instance each time - such decission is part of implementation in derived class.
}
public class InMemoryCacheProvider : ICacheProvider
{ ... }
public class DbStoredCacheProvider : ICacheProvider
{ ... }
// Client code
ICacheProvider provider = new InMemoryCacheProvider
ICache cache = provider.CreateCache();
抽象工厂
// Abstract factory defines families of platform classes - you don't need to specify each platform class on the client.
public interface IDbPlatform
{
// It basically defines many factory methods for related classes
IDbConnection CreateConnection();
IDbCommand CreateCommand();
...
}
// Abstract factory implementation - single class defines whole platform
public class OraclePlatfrom : IDbPlatform
{ ... }
public class MySqlPlatform : IDbPlatform
{ ... }
// Client code:
IDbPlatform platform = new OraclePlatform();
IConnection connection = platform.CreateConnection(); // Automatically Oracle related
...
Builder:
相关帖子:
有用的链接:
sourcemaking设计模式
请访问以下网址以获取更多详细信息。
抽象工厂模式使用子类化(工厂)来生产其他对象(非工厂)。抽象工厂还设想所生产的对象属于平行层次结构(例如,为了处理平台独立性,每个平台都有一个层次结构)。
建造者模式使用子类化来生成“输出”,这些输出不一定是对象。GOF示例中,建造者生成文本输出(标记或其他形式)。
与其他两种模式不同,工厂方法模式将“创建者”分为抽象和具体实现(因此强调它属于框架实现)。像抽象工厂一样,它处理制作实际对象。
所有三种模式都非常相似,因为它们都使用子类化。正是子类化是它们所有的杰出品质,它隐藏了微妙的差异(如上所述),因此许多人难以看到差异。
抽象工厂对于测试驱动开发和减少耦合特别有帮助。
例如,在C#中:
public class Worker
{
public IConsumerFactory Factory { get; set; }
private IResource resource;
public DoWork()
{
IConsumer consumer = Factory.CreateConsumer();
consumer.Consume(resource);
}
}
public interface IConsumerFactory
{
IConsumer CreateConsumer();
}
public interface IConsumer
{
void Consume(IResource resource);
}
public class DefaultConsumerFactory : IConsumerFactory
{
public IConsumer CreateConsumer()
{
return new DefaultConsumer();
}
}
public class DefaultConsumer : IConsumer
{
public void Consume(IResource resource)
{
... Do Work ...
}
}
这样,您可以使用依赖注入来注入生产代码的默认实现,然后您可以轻松地模拟工厂和它创建的对象。