Design Pattern - Abstract Factory pattern and Open Closed Principle
我是设计模式的初学者。
我试图在保持开闭原则的同时使用抽象的工厂模式。
请看下面的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | 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(); } } |
它能成为抽象工厂模式的一个例子吗?
如果是,如何结合开闭原理的概念重构它?
您给出的示例不是抽象工厂。抽象工厂有工厂方法(即创建和返回对象的方法)。
至于开/关原理,抽象的工厂模式本身就促进了这一点。代码是"关闭的",因为如果添加新的工厂(因为您使用的是依赖项注入),则不必修改它,并且它是"打开的",因为您可以通过编写新的抽象工厂来扩展功能。
更新:下面是问题中修改为显示抽象工厂的示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | 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(); } } |
在三种工厂模式中,只有简单的工厂是不按开闭原则的。工厂方法和抽象工厂如果执行得当,应该关闭进行修改,打开进行扩展。文章工厂模式和开放的封闭原则(OCP),"O"在固体出版的GalbjjJava论坛-给出了一个更恰当的解释。文章还介绍了如何调整简单工厂,使其遵循开闭原则。
请参见这个抽象工厂的实现示例(尤其是参见真实世界的示例代码)。
"打开-关闭"原则是指"打开"用于扩展"关闭"用于更改。通过依赖接口并将其注入到application.run()方法中,应用程序类满足了这些原则。您可以通过提供IABStractFormFactory的新实现来扩展它,而无需进行更改。