作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是设计模式的初学者。
我正在尝试使用抽象工厂模式,同时保持开闭原则。
请看下面的代码:
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();
}
}
它可以是抽象工厂模式的一个例子吗?
如果是,我如何结合开闭原则的概念对其进行重构?
最佳答案
您给出的示例不是抽象工厂。抽象工厂有工厂方法(即创建和返回对象的方法)。
至于开放/封闭原则,抽象工厂模式固有地促进了这一点。代码是“封闭的”,因为如果您添加新工厂(因为您正在使用依赖注入(inject))就不必修改它,并且它是“开放的”,因为您可以通过编写新的抽象工厂来扩展功能.
更新:这是修改后的问题中的示例代码以显示抽象工厂:
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();
}
}
关于design-patterns - 设计模式——抽象工厂模式和开闭原则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1108248/
我是一名优秀的程序员,十分优秀!