抽象工厂模式(Abstract Factory):
简而言之,就是提供一个一系列或相互依赖的对象的接口 ,而无需指定它们具体的类。
下面通过一个简单的例子来充分了解简单工厂的具体实现:
首先我们准备一个User的model;
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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 }
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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.需要添加配置文件中的相对键值,相见下文配置文件
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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 }
主程序中的调用
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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 }
配置文件:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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)