3

我是设计模式的初学者。

我正在尝试在保持开闭原则的同时使用抽象工厂模式。

请看下面的代码:

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();
        }
    }

它可以成为抽象工厂模式的一个例子吗?

如果是,我该如何重构它并结合开闭原则的概念?

4

4 回答 4

6

您给出的示例不是抽象工厂。抽象工厂有工厂方法(即创建和返回对象的方法)。

至于开放/封闭原则,抽象工厂模式固有地促进了这一点。代码是“封闭的”,因为如果您添加一个新工厂(因为您正在使用依赖注入),则不必修改它,并且它是“开放的”,因为您可以通过编写一个新的抽象工厂来扩展功能.

更新:这是修改为显示抽象工厂的问题中的示例代码:

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();
    }
}
于 2009-07-10T08:57:41.150 回答
3

三种工厂模式中只有简单工厂不是按照开闭原则。工厂方法和抽象工厂如果实施得当,应该关闭以进行修改并打开以进行扩展。发表在 Globinch java 论坛上的文章工厂设计模式和开闭原则 (OCP),SOLID 中的“O” -对此给出了更恰当的解释。文章还讲述了如何调整简单工厂以遵循开放封闭原则。

于 2013-06-07T05:27:40.973 回答
0

开闭原则意味着“开放”用于扩展“关闭”用于更改。通过依赖接口并将其注入您的 Application.Run() 方法,Application 类符合这些原则。您可以通过提供 IAbstractFormFactory 的新实现来扩展它,而无需进行更改。

于 2009-07-10T08:04:54.940 回答
0

请参阅抽象工厂实现的示例(尤其是查看真实世界的示例代码)。

于 2009-07-10T08:05:09.713 回答