设计模式之抽象工厂模式

抽象工厂模式(Abstract Factory):

简而言之,就是提供一个一系列或相互依赖的对象的接口  ,而无需指定它们具体的类。

 

下面通过一个简单的例子来充分了解简单工厂的具体实现:

首先我们准备一个User的model;

 

ExpandedBlockStart.gif 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

 

ExpandedBlockStart.gif 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

 

ExpandedBlockStart.gif 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 }

 

ExpandedBlockStart.gif 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.需要添加配置文件中的相对键值,相见下文配置文件

     

 

ExpandedBlockStart.gif 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 }

 

主程序中的调用

 

 

ExpandedBlockStart.gif 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 }

 

 

配置文件:

ExpandedBlockStart.gif 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)

 

 

 

转载于:https://www.cnblogs.com/brokge/archive/2013/04/18/3028140.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值