* 模式分析
在以下情况下应当考虑使用抽象工厂模式
~ 一个系统不应当依赖于产品类实例如何被创建,组合和表达的细节,这对于所有形态的
工厂模式都是重要的
~ 一个系统有多于一个的产品族,而系统只消费其中一产品族.
~ 同属于一个产品族的产品是在一起使用的.这一约束必须在系统的设计中体现出来.
~ 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现.
* 源码分析
控制台程序 Program.cs
AbstractFactory_8023
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4/**//*该源码由邹江平2008-8-14编写,如有学习者请与QQ:200580231联系*/
5namespace X8023Z
6{
7 class Program
8 {
9 static void Main(string[] args)
10 {
11 // 创建并运行非洲动物世界。
12 ContinentFactory africa = new AfricaFactory();
13 AnimalWorld world = new AnimalWorld(africa);
14 world.RunFoodChain();
15
16 // 创建并运行美洲动物世界。
17 ContinentFactory america = new AmericaFactory();
18 world = new AnimalWorld(america);
19 world.RunFoodChain();
20 Console.WriteLine("请按任意键退出 !");
21 Console.Read();
22 }
23 }
24
25 abstract class ContinentFactory //抽象工厂(大陆)
26 {
27 abstract public Herbivore CreateHerbivore();//创建草食动物
28 abstract public Carnivore CreateCarnivore();//创建肉食动物
29 }
30
31 class AfricaFactory : ContinentFactory //具体工厂(非洲)
32 {
33 override public Herbivore CreateHerbivore()
34 { return new Wildebeest(); }
35
36 override public Carnivore CreateCarnivore()
37 { return new Lion(); }
38 }
39
40 class AmericaFactory : ContinentFactory //具体工厂(美洲)
41 {
42 override public Herbivore CreateHerbivore()
43 { return new Bison(); }
44
45 override public Carnivore CreateCarnivore()
46 { return new Wolf(); }
47 }
48
49 abstract class Herbivore //抽象产品(草食动物)
50 {
51 }
52
53 abstract class Carnivore //抽象产品(食肉动物)
54 {
55 abstract public void Eat(Herbivore h);
56 }
57
58 class Wildebeest : Herbivore //产品(羚羊)
59 {
60 }
61
62 class Lion : Carnivore //产品(狮子)
63 {
64 override public void Eat(Herbivore h)
65 {
66 // 吃肉食
67 Console.WriteLine("狮子吃 " + h);
68 }
69 }
70
71 class Bison : Herbivore //产品(野牛)
72 {
73 }
74
75 class Wolf : Carnivore //产品(狼)
76 {
77 // Methods
78 override public void Eat(Herbivore h)
79 {
80 // 吃肉食
81 Console.WriteLine( " 狼吃 " + h);
82 }
83 }
84
85 class AnimalWorld //程序客户端
86 {
87 private Herbivore herbivore;
88 private Carnivore carnivore;
89
90 public AnimalWorld(ContinentFactory factory)
91 {
92 carnivore = factory.CreateCarnivore();
93 herbivore = factory.CreateHerbivore();
94 }
95
96 public void RunFoodChain()
97 {
98 carnivore.Eat(herbivore);
99 }
100 }
101
102}
/*该源码由邹江平2008-8-14编写,如有学习者请与QQ:200580231联系*/
* 补充说明
抽象工厂模式以一种倾斜的方式支持增加新的产品,为新产品族的增加提供方便
而不能为新的产品等级结构的增加提供这样的方便.