抽象工厂模式向客户端提供一个接口,使得客户端在不必指定具体类型的情况下,创建多个产品族中的对象。本文采取的仍然是接着以前的那个快餐店的例子。
现在,快餐店经常良好,逐渐发展壮大,为了适合不同地方人的饮食习惯,创建了两大系列(相当于产品族)快餐,北方系列和南方系列。每个系列分别由一个大厨掌勺。
抽象工厂模式对新的产品族支持开闭原则,但对新的产品不支持开闭原则。例如增加新的产品族,如增加美国系列快餐(相当于增加了一个产品族),则只要从每个产品接口继承一个相应美国系列产品即可,不需要更改已有的代码。但如果增加新产品,比如增加了“馒头”这个产品,则它是不支持开闭原则的,因为你要在厨师接口中,增加返回“馒头”的方法,这就要修改已存在的接口,而修改了上层接口,继承此接口的具体类也要随之改变。
使用抽象工厂模式的条件:
1 一个系统不应依赖于产品如何被创建,组合和表达的细节。
2 有多个产品族,而系统只消费其中一个族中的产品
3 同属于一个产品族的产品是在一起使用的。
4 系统提供一个产品的库,所有产品都是以同样的接口实现。 
看下面的C#实现:

 Code
Code1
 namespace ConsoleApplication1
namespace ConsoleApplication12


 {
{3

 /**//// <summary>
    /**//// <summary>4
 /// 抽象工厂模式示例
    /// 抽象工厂模式示例5
 /// </summary>
    /// </summary>6
 class AbstractFactory
    class AbstractFactory7

 
     {
{ 8

9
 //定义厨师的抽象工厂
        //定义厨师的抽象工厂10
 public interface Chef
        public interface Chef11

 
         {
{12
 //这里定义厨师的公共操作
            //这里定义厨师的公共操作13
 //返回抽象面条
            //返回抽象面条14
 Noodle MakeNoodle();
            Noodle MakeNoodle(); 15

16

17
 //返回抽象米饭
            //返回抽象米饭18
 Rice MakeRice();
            Rice MakeRice();19
 //返回抽象面包
            //返回抽象面包20
 Bread MakeBread();
            Bread MakeBread();21
 }
        } 22

23
 //定义北方厨师,实现厨师接口
        //定义北方厨师,实现厨师接口24
 class NorthChef:Chef
        class NorthChef:Chef25

 
         {
{26
 public Noodle MakeNoodle()
            public Noodle MakeNoodle()27

 
             {
{28
 Console.WriteLine("\n制作北方面条
                Console.WriteLine("\n制作北方面条 ");
");29
 Noodle noodle=new NorthNoodle();
                Noodle noodle=new NorthNoodle();30
 return noodle;
                return noodle;31
 }
            }32
 public Rice MakeRice()
            public Rice MakeRice()33

 
             {
{34
 Console.WriteLine("\n制作北方米饭
                Console.WriteLine("\n制作北方米饭 ");
"); 35
 Rice rice=new NorthRice();
                Rice rice=new NorthRice();36
 return rice;
                return rice;37
 }
            }38
 public Bread MakeBread()
            public Bread MakeBread()39

 
             {
{40
 Console.WriteLine("\n正在制作北方面包..");
                Console.WriteLine("\n正在制作北方面包..");41
 Bread bread=new NorthBread();
                Bread bread=new NorthBread();42
 return bread;
                return bread;43
 }
            }44
 }
        } 45

46
 //定义南方厨师,实现厨师接口
        //定义南方厨师,实现厨师接口47
 class SouthChef:Chef
        class SouthChef:Chef48

 
         {
{49
 public Noodle MakeNoodle()
            public Noodle MakeNoodle()50

 
             {
{51
 Console.WriteLine("\n正在制作南方面条。。。");
                Console.WriteLine("\n正在制作南方面条。。。");52
 Noodle noodle=new SouthNoodle();
                Noodle noodle=new SouthNoodle();53
 return noodle;
                return noodle;54
 }
            }55
 public Rice MakeRice()
            public Rice MakeRice()56

 
             {
{57
 Console.WriteLine("\n正在制作南方米饭。。。");
                Console.WriteLine("\n正在制作南方米饭。。。"); 58
 Rice rice=new SouthRice();
                Rice rice=new SouthRice();59
 return rice;
                return rice;60
 }
            }61
 public Bread MakeBread()
            public Bread MakeBread()62

 
             {
{63
 Console.WriteLine("\n正在制作南方面包。。。");
                Console.WriteLine("\n正在制作南方面包。。。");64
 Bread bread=new SouthBread();
                Bread bread=new SouthBread();65
 return bread;
                return bread;66
 }
            }67
 }
        } 68

69
 //定义面条产品
        //定义面条产品70
 public interface Noodle
        public interface Noodle71

 
         {
{72
 //这里定义面条的公共操作
        //这里定义面条的公共操作73
 }
        } 74

75
 class NorthNoodle:Noodle
        class NorthNoodle:Noodle76

 
         {
{77
 public NorthNoodle()
            public NorthNoodle()78

 
             {
{79
 Console.WriteLine("\n一碗地道的北方面条产生了");
                Console.WriteLine("\n一碗地道的北方面条产生了");80
 }
            }81
 }
        } 82

83
 class SouthNoodle:Noodle
        class SouthNoodle:Noodle84

 
         {
{85
 public SouthNoodle()
            public SouthNoodle()86

 
             {
{87
 Console.WriteLine("\n一碗地道的南方面条产生了");
                Console.WriteLine("\n一碗地道的南方面条产生了");88
 }
            }89
 }
        } 90

91
 //定义米饭产品
        //定义米饭产品92
 public interface Rice
        public interface Rice93

 
         {
{94
 //这里定义米饭的公共操作
        //这里定义米饭的公共操作95
 }
        } 96

97
 class NorthRice:Rice
        class NorthRice:Rice98

 
         {
{99
 public NorthRice()
            public NorthRice()100

 
             {
{101
 Console.WriteLine("\n一碗地道的北方米饭产生了");
                Console.WriteLine("\n一碗地道的北方米饭产生了");102
 }
            }103
 }
        } 104

105
 class SouthRice:Rice
        class SouthRice:Rice106

 
         {
{107
 public SouthRice()
            public SouthRice()108

 
             {
{109
 Console.WriteLine("\n一碗地道的南方米饭产生了");
                Console.WriteLine("\n一碗地道的南方米饭产生了");110
 }
            }111
 }
        } 112

113

114
 //定义面包
        //定义面包115
 public interface Bread
        public interface Bread116

 
         {
{117
 //这里可以定义一些面包的公共操作
        //这里可以定义一些面包的公共操作118
 }
        } 119

120
 class NorthBread:Bread
        class NorthBread:Bread121

 
         {
{122
 public NorthBread()
            public NorthBread()123

 
             {
{124
 Console.WriteLine("\n一个地道的北方面包产生了");
                Console.WriteLine("\n一个地道的北方面包产生了");125
 }
            }126
 }
        } 127

128
 class SouthBread:Bread
        class SouthBread:Bread129

 
         {
{130
 public SouthBread()
            public SouthBread()131

 
             {
{132
 Console.WriteLine("\n一个地道的南方面包产生了");
                Console.WriteLine("\n一个地道的南方面包产生了");133
 }
            }134
 }
        } 135

136

 /**//// <summary>
        /**//// <summary>137
 /// 应用程序的主入口点。
        /// 应用程序的主入口点。138
 /// </summary>
        /// </summary>139
 [STAThread]
        [STAThread]140
 static void Main(string[] args)
        static void Main(string[] args)141

 
         {
{142
 //针对接口编程,创建对象尽量返回上层接口,避免使用具体类
            //针对接口编程,创建对象尽量返回上层接口,避免使用具体类143
 //下面隐藏了具体的创建各种面条,米饭和面包的过程
            //下面隐藏了具体的创建各种面条,米饭和面包的过程144
 Console.WriteLine("\n-------------北方厨师-------------------\n");
            Console.WriteLine("\n-------------北方厨师-------------------\n"); 145

146
 Chef northChef=new NorthChef();
           Chef northChef=new NorthChef();147
 northChef.MakeNoodle();
            northChef.MakeNoodle();148
 northChef.MakeRice();
            northChef.MakeRice();149
 northChef.MakeBread();
            northChef.MakeBread(); 150

151
 Console.WriteLine("\n-------------南方厨师-------------------\n");
            Console.WriteLine("\n-------------南方厨师-------------------\n"); 152

153
 Chef southChef=new SouthChef();
           Chef southChef=new SouthChef();154
 southChef.MakeNoodle();
            southChef.MakeNoodle();155
 southChef.MakeRice();
            southChef.MakeRice();156
 southChef.MakeBread();
            southChef.MakeBread(); 157

158
 Console.ReadLine();
            Console.ReadLine();159
 }
        }160
 }
    }161
 }
} 162

 
                     
                    
                 
                    
                 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号