Design patterns 设计模式-抽象工厂模式和开闭原则
我是设计模式的初学者 我试图在保持开闭原则的同时使用抽象工厂模式 请看下面的代码:Design patterns 设计模式-抽象工厂模式和开闭原则,design-patterns,open-closed-principle,Design Patterns,Open Closed Principle,我是设计模式的初学者 我试图在保持开闭原则的同时使用抽象工厂模式 请看下面的代码: public interface IAbstractFormFactory { void ShowOSName(); } public class VistaForm : IAbstractFormFactory { public void ShowOSName() { Console.WriteLi
public interface IAbstractFormFactory
{
void ShowOSName();
}
public class VistaForm : IAbstractFormFactory
{
public void ShowOSName()
{
Console.WriteLine("Vista");
}
}
public class WinXpForm : IAbstractFormFactory
{
public void ShowOSName()
{
Console.WriteLine("Win XP");
}
}
public static class Application
{
public static void Run(IAbstractFormFactory factory)
{
factory.ShowOSName();
}
}
public class Program
{
public static void Main()
{
IAbstractFormFactory form;
int sys = 0;
if (sys == 0)
{
form = new WinXpForm();
}
else
{
form = new VistaForm();
}
Application.Run(form);
Console.ReadLine();
}
}
它能成为抽象工厂模式的一个例子吗
如果是,我如何结合开闭原则的概念对其进行重构?开闭原则对于扩展意味着“打开”,对于更改意味着“关闭”。通过依赖接口并将其注入到Application.Run()方法中,应用程序类满足这些原则。您可以通过提供IAbstractFormFactory的新实现来扩展它,而无需进行更改。请参阅抽象工厂实现的示例(尤其是查看真实世界的示例代码)。您给出的示例不是抽象工厂。抽象工厂有工厂方法(即创建和返回对象的方法) 至于开/关原则,抽象工厂模式本质上促进了这一点。代码是“封闭”的,因为如果您添加了一个新工厂(因为您使用的是依赖项注入),它就不必修改;代码是“开放”的,因为您可以通过编写一个新的抽象工厂来扩展功能 更新:以下是问题中的示例代码,已修改为显示抽象工厂:
public interface IForm
{
void ShowFormName();
}
public interface IAbstractFormFactory
{
IForm MakeForm();
}
public class VistaForm : IForm
{
public void ShowFormName()
{
Console.WriteLine("Vista Form");
}
}
public class VistaFormFactory : IAbstractFormFactory
{
public IForm MakeForm()
{
return new VistaForm();
}
}
public class WinXpForm : IForm
{
public void ShowFormName()
{
Console.WriteLine("WinXP Form");
}
}
public class WinXpFormFactory : IAbstractFormFactory
{
public IForm MakeForm()
{
return new WinXpForm();
}
}
public static class Application
{
public static void Run(IAbstractFormFactory factory)
{
IForm form = factory.MakeForm();
form.ShowFormName();
}
}
public class Program
{
public static void Main()
{
IAbstractFormFactory factory;
int sys = 0;
if (sys == 0)
{
factory = new WinXpFormFactory();
}
else
{
factory = new VistaFormFactory();
}
Application.Run(factory);
Console.ReadLine();
}
}
在这三种工厂模式中,只有简单的工厂并没有按照开闭原则。工厂方法和抽象工厂如果执行正确,应关闭以进行修改,并打开以进行扩展。发表在Globeinch java论坛上的文章对此给出了更恰当的解释。文章还讲述了如何调整简单工厂,使其遵循开闭原则。哦,上帝!这是最模糊的讨论。模糊?不,嘿嘿。除了HeadFirst设计模式手册之外,我认为这个网站非常有助于提供一个很好的示例来理解模式。但是我必须不断地更改程序类以添加更多的类型。那么,在这种情况下,您如何解释OCP呢?很明显,每次您想要添加一些内容时,您都必须更改代码中的一些内容。但在班级层面,一切都是一样的。您只需添加实现接口的新类,而不必更改任何已创建的类。你确定吗?你正确地使用了接口/多态性/依赖注入,但是工厂没有创建任何东西,所以它们不是真正的工厂。我将添加一些代码作为抽象工厂的示例。谢谢@Tom!这非常有帮助。