设计模式之抽象工厂模式
抽象工厂模式(Abstract Factory):
简而言之,就是提供一个一系列或相互依赖的对象的接口 ,而无需指定它们具体的类。
下面通过一个简单的例子来充分了解简单工厂的具体实现:
首先我们准备一个User的model;
User model
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace 抽象工厂
7 {
8 class User
9 {
10 private int _id;
11 public int id
12 {
13 get { return _id; }
14 set { _id = value; }
15 }
16
17 private string _name;
18 public string name
19 {
20 get { return _name; }
21 set { _name = value; }
22
23 }
24 }
25 }
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace 抽象工厂
7 {
8 class User
9 {
10 private int _id;
11 public int id
12 {
13 get { return _id; }
14 set { _id = value; }
15 }
16
17 private string _name;
18 public string name
19 {
20 get { return _name; }
21 set { _name = value; }
22
23 }
24 }
25 }
接着我们准备一个User的接口 Iuser
IUser
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace 抽象工厂
7 {
8 interface IUser
9 {
10 void insert(User user);
11 User getuser(int id);
12
13 }
14 }
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace 抽象工厂
7 {
8 interface IUser
9 {
10 void insert(User user);
11 User getuser(int id);
12
13 }
14 }
再来我们准备不同数据库之间的实现 这里只提供两种 SqlserverUser 和AccessUser
SqlserverUser
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace 抽象工厂
7 {
8 class SqlserverUser:IUser
9 {
10
11 public void insert(User user)
12 {
13 Console.WriteLine("向Access数据库中添加了一个用户{0}", user.name);
14
15 }
16
17 public User getuser(int id)
18 {
19
20 Console.WriteLine("从sqlserver数据库根据id为{0}获取了一个用户信息",id);
21 return null;
22
23 }
24
25
26 }
27 }
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace 抽象工厂
7 {
8 class SqlserverUser:IUser
9 {
10
11 public void insert(User user)
12 {
13 Console.WriteLine("向Access数据库中添加了一个用户{0}", user.name);
14
15 }
16
17 public User getuser(int id)
18 {
19
20 Console.WriteLine("从sqlserver数据库根据id为{0}获取了一个用户信息",id);
21 return null;
22
23 }
24
25
26 }
27 }
AccessUser
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace 抽象工厂
7 {
8 class AccessUser:IUser
9 {
10 public void insert(User user)
11 {
12 Console.WriteLine("向Access数据库中添加了一个用户{0}",user.name);
13
14 }
15
16 public User getuser(int id)
17 {
18
19 Console.WriteLine("从Access数据库中获取一个id为{0}的用户",id);
20
21
22 return null;
23
24 }
25 }
26 }
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace 抽象工厂
7 {
8 class AccessUser:IUser
9 {
10 public void insert(User user)
11 {
12 Console.WriteLine("向Access数据库中添加了一个用户{0}",user.name);
13
14 }
15
16 public User getuser(int id)
17 {
18
19 Console.WriteLine("从Access数据库中获取一个id为{0}的用户",id);
20
21
22 return null;
23
24 }
25 }
26 }
再来最重要的一环
这里采用了反射原理来对数据实例进行不同操作
通过反射实现抽象工厂的模式的话 需注意点
1.加入其他表时:需要添加的有:model(例:User), DataBase类型名+model名(例:SqlserverUser), 接口(例:IUser)
2.需要添加配置文件中的相对键值,相见下文配置文件
DataAccess
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Reflection;
6 using System.Configuration;
7
8 namespace 抽象工厂
9 {
10 class DataAccess
11 {
12 /// <summary>
13 /// 通过反射实现抽象工厂的模式的话 需注意点
14 /// 1.加入其他表时:需要添加的有:model(例:User), DataBase类型名+model名(例:SqlserverUser), 接口(例:IUser)
15 ///
16 /// </summary>
17
18 private static readonly string AssemblyName = "抽象工厂";//程序集名
19 private static readonly string DB =ConfigurationSettings.AppSettings ["DB"];
20 /// <summary>
21 /// 创建实例
22 /// </summary>
23 /// <returns>返回此类名的实例</returns>
24 public static IUser CreateUser()
25 {
26
27 string className = AssemblyName + "." + DB + "User";//得到的类名就是SqlserverUser(必须是存在的)
28 return (IUser)Assembly.Load(AssemblyName).CreateInstance(className);//返回此类名的实例
29 }
30
31 //public static IDpartment CreateDpartment()
32 //{
33
34 // string className = AssemblyName + "." + DB + "Dpartment";
35 // return (IUser)Assembly.Load(AssemblyName).CreateInstance(className);
36 //}
37 }
38 }
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Reflection;
6 using System.Configuration;
7
8 namespace 抽象工厂
9 {
10 class DataAccess
11 {
12 /// <summary>
13 /// 通过反射实现抽象工厂的模式的话 需注意点
14 /// 1.加入其他表时:需要添加的有:model(例:User), DataBase类型名+model名(例:SqlserverUser), 接口(例:IUser)
15 ///
16 /// </summary>
17
18 private static readonly string AssemblyName = "抽象工厂";//程序集名
19 private static readonly string DB =ConfigurationSettings.AppSettings ["DB"];
20 /// <summary>
21 /// 创建实例
22 /// </summary>
23 /// <returns>返回此类名的实例</returns>
24 public static IUser CreateUser()
25 {
26
27 string className = AssemblyName + "." + DB + "User";//得到的类名就是SqlserverUser(必须是存在的)
28 return (IUser)Assembly.Load(AssemblyName).CreateInstance(className);//返回此类名的实例
29 }
30
31 //public static IDpartment CreateDpartment()
32 //{
33
34 // string className = AssemblyName + "." + DB + "Dpartment";
35 // return (IUser)Assembly.Load(AssemblyName).CreateInstance(className);
36 //}
37 }
38 }
主程序中的调用
Program
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace 抽象工厂
7 {
8 class Program
9 {
10 static void Main(string[] args)
11 {
12 User user = new User();
13 user.name = "小明";
14 //SqlserverUser su=new SqlserverUser ();
15 //su.insert(user);
16 //su.getuser(1);
17 /* IFactory factory = new SqlserverFactory();
18 IUser iuser = factory.CreateUser();
19
20 iuser.insert(user);
21 iuser.getuser(1);*/
22 IUser iuser = DataAccess.CreateUser();
23
24 iuser.insert(user);
25 iuser.getuser(1);
26
27 Console.ReadLine();
28
29 }
30 }
31 }
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace 抽象工厂
7 {
8 class Program
9 {
10 static void Main(string[] args)
11 {
12 User user = new User();
13 user.name = "小明";
14 //SqlserverUser su=new SqlserverUser ();
15 //su.insert(user);
16 //su.getuser(1);
17 /* IFactory factory = new SqlserverFactory();
18 IUser iuser = factory.CreateUser();
19
20 iuser.insert(user);
21 iuser.getuser(1);*/
22 IUser iuser = DataAccess.CreateUser();
23
24 iuser.insert(user);
25 iuser.getuser(1);
26
27 Console.ReadLine();
28
29 }
30 }
31 }
配置文件:
View Code
1 <?xml version="1.0" encoding="utf-8" ?>
2 <configuration>
3
4 <appSettings>
5 <add key="DB" value="Sqlserver" />
6
7 </appSettings>
8
9
10
11 </configuration>
2 <configuration>
3
4 <appSettings>
5 <add key="DB" value="Sqlserver" />
6
7 </appSettings>
8
9
10
11 </configuration>
通过反射实现抽象工厂的模式的话 需注意点
1.加入其他表时:需要添加的有:model(例:User), DataBase类型名+model名(例:SqlserverUser), 接口(例:IUser)