1.抽象工厂----担任这个角色的是工厂方法模式的核心,它是与应用系统商业逻辑无关的。
2.具体工厂----这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。
3.抽象产品----担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。
4.具体产品----抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。
5.用户----用户通过抽象工厂和抽象产品选择自己所需要的具体产品
二。UML类图

三。代码
1
using System;
2
using System.Collections.Generic;
3
using System.Text;
4
5
namespace Pattern
6

{
7
public class AbstratcFactory
8
{
9
public static void Main(string[] args)
10
{
11
AbstractSql delete = new SqlServer();
12
ClientUser user1 = new ClientUser(delete);
13
user1.Show();
14
15
AbstractSql insert = new Oracle();
16
ClientUser user2 = new ClientUser(insert);
17
user2.Show();
18
}
19
}
20
21
//抽象工厂类
22
public abstract class AbstractSql
23
{
24
public abstract AbstractInsert Insert();
25
public abstract AbstractDelete Delete();
26
}
27
28
//具体工厂[SqlServer]
29
public class SqlServer:AbstractSql
30
{
31
public override AbstractInsert Insert()
32
{
33
return new SqlServerInsert();
34
}
35
36
public override AbstractDelete Delete()
37
{
38
return new SqlServerDelete();
39
}
40
}
41
42
//具体工厂[Oracle]
43
public class Oracle:AbstractSql
44
{
45
public override AbstractInsert Insert()
46
{
47
return new OracleInsert();
48
}
49
50
public override AbstractDelete Delete()
51
{
52
return new OracleDelete();
53
}
54
}
55
56
//抽象产品[Insert]
57
public abstract class AbstractInsert
58
{ }
59
60
//抽象产品[Delete]
61
public abstract class AbstractDelete
62
{
63
public abstract void Interact(AbstractInsert insert);
64
}
65
66
//具体产品1[SqlServerInsert]
67
public class SqlServerInsert : AbstractInsert
68
{ }
69
70
//具体产品1[OracleInsert]
71
public class OracleInsert : AbstractInsert
72
{ }
73
74
//具体产品2[SqlServerDelete]
75
public class SqlServerDelete : AbstractDelete
76
{
77
public override void Interact(AbstractInsert insert)
78
{
79
Console.WriteLine(this.GetType().Name + " interacts with: " + insert.GetType().Name);
80
}
81
}
82
//具体产品2[OracleDelete]
83
public class OracleDelete : AbstractDelete
84
{
85
public override void Interact(AbstractInsert insert)
86
{
87
Console.WriteLine(this.GetType().Name + " interacts with: " + insert.GetType().Name);
88
}
89
}
90
91
//用户
92
public class ClientUser
93
{
94
private AbstractInsert AbstractInsert;
95
private AbstractDelete AbstractDelete;
96
97
public ClientUser(AbstractSql sql)
98
{
99
AbstractInsert = sql.Insert();
100
AbstractDelete = sql.Delete();
101
}
102
103
public void Show()
104
{
105
AbstractDelete.Interact(AbstractInsert);
106
}
107
}
108
}
109

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

74

75

76



77

78



79

80

81

82

83

84



85

86



87

88

89

90

91

92

93



94

95

96

97

98



99

100

101

102

103

104



105

106

107

108

109
