首页 > 代码库 > 第3章 抽象工厂模式(Abstract Factory)

第3章 抽象工厂模式(Abstract Factory)

原文 第3章 抽象工厂模式(Abstract Factory)

场景我们的系统要同时支持两个数据库  SqlServer 跟Oracle数据库  并且不同的环境要进行随时切换。

看下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
    interface ISqlServer
    {
        //数据库添加操作
        public void Add();
    }
    interface IOracle
    {
        //数据库添加操作
        public void Add();
 
    }
     
     class SqlServer : ISqlServer
    {
        public void Add()
        {
            Console.WriteLine("SqlServer添加操作");
        }
    }
    class Oracle : IOracle
    {
        public void Add()
        {
            Console.WriteLine("Oracle添加操作");
        }
    }
     
     
     
     class SqlServerFactory : AbstractFactory
    {
        public ISqlServer GetSqlServer()
        {
            return new SqlServer();
        }
 
    }
    class OracleFactory : AbstractFactory
    {
 
        public IOracle GetOracle()
        {
            return new Oracle();
        }
    }
     
     
     
    interface AbstractFactory
    {
      public   ISqlServer GetSqlServer();
      public   IOracle GetOracle();
 
    }
     
     static void Main(string[] args)
        {
            //调用的场景
            AbstractFactory sqlServer = new SqlServerFactory();
            sqlServer.GetSqlServer().Add();
            AbstractFactory oracleServer = new OracleFactory();
            sqlServer.GetOracle().Add();
 
        }

这样调用还是觉得有点麻烦,我们可以用反射来实例化对象。 我们在来完善一下AbstractFactory。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
  public   abstract AbstractFactory
    {
        public static AbstractFactory GetInstance()
        {
            string factoryName = System.Configuration.ConfigurationManager.AppSettings["factoryName"];
 
            AbstractFactory instance;
 
            if (factoryName != "")
                instance = (AbstractFactory)Assembly.Load(factoryName).CreateInstance(factoryName);
            else
                instance = null;
 
 
            return instance;
        }
        public abstract ISqlServer GetSqlServer();
        public abstract IOracle GetOracle();
 
    }
     
    //调用
      static void Main(string[] args)
        {
    
            AbstractFactory.GetInstance().GetOracle().Add();
            AbstractFactory.GetInstance().GetSqlServer().Add();
        }
1
2
3
4
5
6
7
//配置config文件
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
        <add key="factoryName" value="SqlServerFactory"></add>
    </appSettings>
</configuration>

这样是不是感觉方便了很多 利用反射来进行自动实例化。

 

  设计模式系列文章入口:http://www.diyibk.com/post/39.html