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

三。代码
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
using System;2
using System.Collections.Generic;3
using System.Text;4

5
namespace Pattern6
{7
public class AbstratcFactory8
{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 AbstractSql23
{ 24
public abstract AbstractInsert Insert();25
public abstract AbstractDelete Delete();26
}27

28
//具体工厂[SqlServer]29
public class SqlServer:AbstractSql30
{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:AbstractSql44
{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 AbstractInsert58
{ }59
60
//抽象产品[Delete]61
public abstract class AbstractDelete62
{63
public abstract void Interact(AbstractInsert insert);64
}65

66
//具体产品1[SqlServerInsert]67
public class SqlServerInsert : AbstractInsert68
{ }69
70
//具体产品1[OracleInsert]71
public class OracleInsert : AbstractInsert72
{ }73
74
//具体产品2[SqlServerDelete]75
public class SqlServerDelete : AbstractDelete76
{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 : AbstractDelete84
{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 ClientUser93
{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




浙公网安备 33010602011771号