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