关于设计模式:设计模式 – 抽象工厂模式和开放封闭原则

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的新实现来扩展它,而无需进行更改。