* 模式分析
在以下情况下应当考虑使用抽象工厂模式
~ 一个系统不应当依赖于产品类实例如何被创建,组合和表达的细节,这对于所有形态的
工厂模式都是重要的
~ 一个系统有多于一个的产品族,而系统只消费其中一产品族.
~ 同属于一个产品族的产品是在一起使用的.这一约束必须在系统的设计中体现出来.
~ 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现.
* 源码分析
控制台程序 Program.csAbstractFactory_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联系*/
* 补充说明
抽象工厂模式以一种倾斜的方式支持增加新的产品,为新产品族的增加提供方便
而不能为新的产品等级结构的增加提供这样的方便.