Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 设计模式-抽象工厂模式和开闭原则_Design Patterns_Open Closed Principle - Fatal编程技术网

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!这非常有帮助。