设计模式之抽象工厂模式

抽象工厂模式(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 }

接着我们准备一个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 }

再来我们准备不同数据库之间的实现  这里只提供两种  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 }

 

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 }

 

再来最重要的一环 

 这里采用了反射原理来对数据实例进行不同操作

通过反射实现抽象工厂的模式的话 需注意点
      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 }

 

主程序中的调用

 

 

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 }

 

 

配置文件:

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>

 

 

 

 通过反射实现抽象工厂的模式的话 需注意点
      1.加入其他表时:需要添加的有:model(例:User),  DataBase类型名+model名(例:SqlserverUser), 接口(例:IUser)

 

 

 

posted @ 2013-04-18 11:52  brokge  阅读(156)  评论(0编辑  收藏  举报