尽管在某种程度上,单件模式(Singleton Pattem)是限制而不是改进类的创建,但它仍和其他创建型模式分在一组。单件模式可以保证一个类有且只有一个实列。并提供一个访问它的全局访问点。在程序设计过程中,有很多情况需要确保一个类只有一个实列。例如,系统中只能有一个窗口管理器,一个打印假托机,或者一个数据引擎访问点。PC机中可能有几个串口,但只能有一个Com1实列。
并且这样实现的Thinking类是线程安全的。
下面我们看看如何用Pascal语言,以类似静态方法来实现:
下面我们再看一个现实中的例子,连接池的问题。许多应用程序需要访问存储在数据库和其他数据源。要访问数据库中的数据,应用程序就需要建立到数据库的连接。然后,应用程序就可以使用连接进行数据访问。建立数据库连接会花相对较长的时间,因为在建立连接的过程中数据库服务器和应用程序之间必须进行协商。数据库连接也会消耗宝贵的系统资源,如CPU处理能力,内存,网络带宽。因此,很值得研究和应用技术来减少建立数据库连接的需要和活动连接数量。在这个前提下我们来看看程序代码:
看看Pascal的实现:
在这个例子中我们可以看到Pooling这个连接池类是个Singleton类。即无论PoolingTester被实例化多少次,我们Pooling只会被初始化一次。以上思路可以用在Web应用程序中,由于IIS本身是作为COM+应用程序安装的,就COM+而言,同一个Web应用程序中的所有网页都在一个进程中运行。因此,它们也可共享相同的连接库。
单例模式的特点:
- 单例类只能有一个实例。
- 单例类必须自己创建自己的唯一实例。
- 单例类必须给所有其它对象提供这一实例。
Singleton的设计方式大体上分为两种:
1.使用静态方法创建单件,我们将用Pascal(定制)实现
2.利用C#特有机制创建单件,我们将用C#来实现
下面我们看看利用C#特有机制创建单件的过程。为了方便起见我们在以前的SimFactory例子上作一些修改看看Singleton的实现过程。
UML图:
具体代码:
1
using System;
2![](/Images/OutliningIndicators/None.gif)
3
namespace Singleton
4
{
5
/**//// <summary>
6
///============== Program Description==============
7
///Name:Singleton.cs
8
///Objective:Singleton
9
///Date:2006-04-26
10
///Written By coffee.liu
11
///================================================
12
/// </summary>
13
class Class1
14
{
15
/**//// <summary>
16
/// 应用程序的主入口点。
17
/// </summary>
18
[STAThread]
19
static void Main(string[] args)
20
{
21
Thinking tk1,tk2,tk3;
22
PersonSimFactory PSF=new PersonSimFactory();
23
Person PP=PSF.GetPerson("Yellow");
24
tk1=PP.GetTk;
25
PP.GetInfo();
26
Console.WriteLine(".");
27
PP=PSF.GetPerson("Black");
28
tk2=PP.GetTk;
29
PP.GetInfo();
30
Console.WriteLine(".");
31
PP=PSF.GetPerson("Write");
32
tk3=PP.GetTk;
33
PP.GetInfo();
34
if ((tk1==tk2)&&(tk2==tk3)&&(tk1==tk3))
35
Console.WriteLine("we are the same Thinking");
36![](/Images/OutliningIndicators/InBlock.gif)
37
}
38
}
39
/**//// <summary>
40
/// 每个人都有思维
41
/// Thinking类被定为sealed类即不能被其他类继承
42
/// 我们把instance定义成了 static readonly属性,
43
/// 如果类中的static属性被任何方法使用时,.NET Framework将对这个属性进行初始化,
44
/// 于是在初始化Instance属性的同时Thinking类实例得以创建和装载。
45
/// 而私有的构造函数和readonly(只读)保证了Thinking不会被再次实例化,
46
/// 从而实现了Singleton的目的。
47
/// </summary>
48![](/Images/OutliningIndicators/InBlock.gif)
49
public sealed class Thinking
50
{
51
public static readonly Thinking instance=new Thinking();
52
private Thinking(){}
53
54
public static Thinking Instance
55
{
56
get
57
{
58
return instance;
59
}
60
}
61
public void Say(){
62
Console.WriteLine("I have a Thinking");
63
}
64
65
}
66![](/Images/OutliningIndicators/InBlock.gif)
67
public class Person
68
{
69
protected Thinking tk;
70
protected string sex,race;
71
public Thinking GetTk
72
{
73
get {return tk;}
74
}
75
public string GetSex()
76
{
77
return sex;
78
}
79
public string GetRace()
80
{
81
return race;
82
}
83
public virtual void GetInfo()
84
{
85
}
86
}
87![](/Images/OutliningIndicators/InBlock.gif)
88
public class YellowPerson:Person
89
{
90
public YellowPerson()
91
{
92
sex="Man";
93
race="Yellow";
94
}
95
public YellowPerson(string Ysex)
96
{
97
sex=Ysex;
98
race="Yellow";
99
}
100
public override void GetInfo()
101
{
102
Console.WriteLine("the "+race+" Person Info:"+sex);
103
tk=Thinking.Instance;
104
tk.Say();
105
}
106
}
107![](/Images/OutliningIndicators/InBlock.gif)
108
public class BlackPerson:Person
109
{
110
public BlackPerson()
111
{
112
sex="Man";
113
race="Black";
114
}
115
public BlackPerson(string Bsex)
116
{
117
sex=Bsex;
118
race="Black";
119
}
120
public override void GetInfo()
121
{
122
Console.WriteLine("the "+race+" Person Info:"+sex);
123
tk=Thinking.Instance;
124
tk.Say();
125
}
126
}
127![](/Images/OutliningIndicators/InBlock.gif)
128
public class WritePerson:Person
129
{
130
public WritePerson()
131
{
132
sex="Man";
133
race="Write";
134
}
135
public WritePerson(string Wsex)
136
{
137
sex=Wsex;
138
race="Write";
139
}
140
public override void GetInfo()
141
{
142
Console.WriteLine("the "+race+" Person Info:"+sex);
143
tk=Thinking.Instance;
144
tk.Say();
145
}
146
}
147
public class PersonSimFactory
148
{
149
public PersonSimFactory(){}
150
public Person GetPerson(string RaceType)
151
{
152
if (RaceType=="Yellow")
153
return new YellowPerson();
154
else
155
if (RaceType=="Black")
156
return new BlackPerson();
157
else
158
if (RaceType=="Write")
159
return new WritePerson();
160
else
161
return new YellowPerson();
162
163
}
164
}
165
}
166![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
5
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
6
![](/Images/OutliningIndicators/InBlock.gif)
7
![](/Images/OutliningIndicators/InBlock.gif)
8
![](/Images/OutliningIndicators/InBlock.gif)
9
![](/Images/OutliningIndicators/InBlock.gif)
10
![](/Images/OutliningIndicators/InBlock.gif)
11
![](/Images/OutliningIndicators/InBlock.gif)
12
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
13
![](/Images/OutliningIndicators/InBlock.gif)
14
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
15
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
16
![](/Images/OutliningIndicators/InBlock.gif)
17
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
18
![](/Images/OutliningIndicators/InBlock.gif)
19
![](/Images/OutliningIndicators/InBlock.gif)
20
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
21
![](/Images/OutliningIndicators/InBlock.gif)
22
![](/Images/OutliningIndicators/InBlock.gif)
23
![](/Images/OutliningIndicators/InBlock.gif)
24
![](/Images/OutliningIndicators/InBlock.gif)
25
![](/Images/OutliningIndicators/InBlock.gif)
26
![](/Images/OutliningIndicators/InBlock.gif)
27
![](/Images/OutliningIndicators/InBlock.gif)
28
![](/Images/OutliningIndicators/InBlock.gif)
29
![](/Images/OutliningIndicators/InBlock.gif)
30
![](/Images/OutliningIndicators/InBlock.gif)
31
![](/Images/OutliningIndicators/InBlock.gif)
32
![](/Images/OutliningIndicators/InBlock.gif)
33
![](/Images/OutliningIndicators/InBlock.gif)
34
![](/Images/OutliningIndicators/InBlock.gif)
35
![](/Images/OutliningIndicators/InBlock.gif)
36
![](/Images/OutliningIndicators/InBlock.gif)
37
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
38
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
39
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
40
![](/Images/OutliningIndicators/InBlock.gif)
41
![](/Images/OutliningIndicators/InBlock.gif)
42
![](/Images/OutliningIndicators/InBlock.gif)
43
![](/Images/OutliningIndicators/InBlock.gif)
44
![](/Images/OutliningIndicators/InBlock.gif)
45
![](/Images/OutliningIndicators/InBlock.gif)
46
![](/Images/OutliningIndicators/InBlock.gif)
47
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
48
![](/Images/OutliningIndicators/InBlock.gif)
49
![](/Images/OutliningIndicators/InBlock.gif)
50
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
51
![](/Images/OutliningIndicators/InBlock.gif)
52
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
53
![](/Images/OutliningIndicators/InBlock.gif)
54
![](/Images/OutliningIndicators/InBlock.gif)
55
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
56
![](/Images/OutliningIndicators/InBlock.gif)
57
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
58
![](/Images/OutliningIndicators/InBlock.gif)
59
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
60
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
61
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
62
![](/Images/OutliningIndicators/InBlock.gif)
63
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
64
![](/Images/OutliningIndicators/InBlock.gif)
65
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
66
![](/Images/OutliningIndicators/InBlock.gif)
67
![](/Images/OutliningIndicators/InBlock.gif)
68
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
69
![](/Images/OutliningIndicators/InBlock.gif)
70
![](/Images/OutliningIndicators/InBlock.gif)
71
![](/Images/OutliningIndicators/InBlock.gif)
72
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
73
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
74
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
75
![](/Images/OutliningIndicators/InBlock.gif)
76
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
77
![](/Images/OutliningIndicators/InBlock.gif)
78
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
79
![](/Images/OutliningIndicators/InBlock.gif)
80
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
81
![](/Images/OutliningIndicators/InBlock.gif)
82
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
83
![](/Images/OutliningIndicators/InBlock.gif)
84
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
85
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
86
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
87
![](/Images/OutliningIndicators/InBlock.gif)
88
![](/Images/OutliningIndicators/InBlock.gif)
89
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
90
![](/Images/OutliningIndicators/InBlock.gif)
91
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
92
![](/Images/OutliningIndicators/InBlock.gif)
93
![](/Images/OutliningIndicators/InBlock.gif)
94
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
95
![](/Images/OutliningIndicators/InBlock.gif)
96
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
97
![](/Images/OutliningIndicators/InBlock.gif)
98
![](/Images/OutliningIndicators/InBlock.gif)
99
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
100
![](/Images/OutliningIndicators/InBlock.gif)
101
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
102
![](/Images/OutliningIndicators/InBlock.gif)
103
![](/Images/OutliningIndicators/InBlock.gif)
104
![](/Images/OutliningIndicators/InBlock.gif)
105
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
106
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
107
![](/Images/OutliningIndicators/InBlock.gif)
108
![](/Images/OutliningIndicators/InBlock.gif)
109
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
110
![](/Images/OutliningIndicators/InBlock.gif)
111
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
112
![](/Images/OutliningIndicators/InBlock.gif)
113
![](/Images/OutliningIndicators/InBlock.gif)
114
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
115
![](/Images/OutliningIndicators/InBlock.gif)
116
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
117
![](/Images/OutliningIndicators/InBlock.gif)
118
![](/Images/OutliningIndicators/InBlock.gif)
119
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
120
![](/Images/OutliningIndicators/InBlock.gif)
121
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
122
![](/Images/OutliningIndicators/InBlock.gif)
123
![](/Images/OutliningIndicators/InBlock.gif)
124
![](/Images/OutliningIndicators/InBlock.gif)
125
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
126
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
127
![](/Images/OutliningIndicators/InBlock.gif)
128
![](/Images/OutliningIndicators/InBlock.gif)
129
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
130
![](/Images/OutliningIndicators/InBlock.gif)
131
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
132
![](/Images/OutliningIndicators/InBlock.gif)
133
![](/Images/OutliningIndicators/InBlock.gif)
134
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
135
![](/Images/OutliningIndicators/InBlock.gif)
136
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
137
![](/Images/OutliningIndicators/InBlock.gif)
138
![](/Images/OutliningIndicators/InBlock.gif)
139
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
140
![](/Images/OutliningIndicators/InBlock.gif)
141
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
142
![](/Images/OutliningIndicators/InBlock.gif)
143
![](/Images/OutliningIndicators/InBlock.gif)
144
![](/Images/OutliningIndicators/InBlock.gif)
145
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
146
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
147
![](/Images/OutliningIndicators/InBlock.gif)
148
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
149
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
150
![](/Images/OutliningIndicators/InBlock.gif)
151
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
152
![](/Images/OutliningIndicators/InBlock.gif)
153
![](/Images/OutliningIndicators/InBlock.gif)
154
![](/Images/OutliningIndicators/InBlock.gif)
155
![](/Images/OutliningIndicators/InBlock.gif)
156
![](/Images/OutliningIndicators/InBlock.gif)
157
![](/Images/OutliningIndicators/InBlock.gif)
158
![](/Images/OutliningIndicators/InBlock.gif)
159
![](/Images/OutliningIndicators/InBlock.gif)
160
![](/Images/OutliningIndicators/InBlock.gif)
161
![](/Images/OutliningIndicators/InBlock.gif)
162
![](/Images/OutliningIndicators/InBlock.gif)
163
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
164
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
165
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
166
![](/Images/OutliningIndicators/None.gif)
并且这样实现的Thinking类是线程安全的。
下面我们看看如何用Pascal语言,以类似静态方法来实现:
1
program singleton;
2
//============== Program Description==============
3
//Name:singleton.dpr
4
//Objective:singleton
5
//Date:2006-04-27
6
//Written By coffee.liu
7
//================================================
8
{$APPTYPE CONSOLE}
9![](/Images/OutliningIndicators/None.gif)
10
uses
11
SysUtils;
12
type Thinking=class
13
public
14
class function GetInstance():Thinking;
15
////作为Delphi来说,不能将contructor设为private,如果设为private,编译器将自动将
16
////constructor更正为public
17
////我们在这里重载NewInstance静态方法来控制构造函数防止其创建出多个实例
18
class function NewInstance:Tobject;override;
19
procedure FreeInstance;override;
20
public procedure Say;
21
end;
22
type Person=class
23
protected
24
sex:string;
25
race:string;
26
tk:Thinking;
27
property GetThinking:Thinking read tk;
28
public function GetSex():string;
29
public function GetRace():string;
30
public procedure GetInfo;virtual;abstract;
31![](/Images/OutliningIndicators/InBlock.gif)
32
end;
33
type YellowPerson=class(Person)
34
constructor YellowPerson();
35
public procedure GetInfo;override;
36
end;
37
type BlackPerson=class(Person)
38
constructor BlackPerson();
39
public procedure GetInfo;override;
40
end;
41
type WritePerson=class(Person)
42
constructor WritePerson();
43
public procedure GetInfo;override;
44
end;
45
type PersonSimFactory=class
46
constructor PersonSimFactory();
47
public function GetPerson(RaceType:string):Person;
48
end;
49
var
50
GlobalThinking:Thinking=nil;
51
PSF:PersonSimFactory;
52
PP:Person;
53
{ Person }
54![](/Images/OutliningIndicators/InBlock.gif)
55
function Person.GetRace: string;
56
begin
57
result:=race;
58
end;
59![](/Images/OutliningIndicators/InBlock.gif)
60
function Person.GetSex: string;
61
begin
62
result:=sex;
63
end;
64![](/Images/OutliningIndicators/InBlock.gif)
65
{ YellowPerson }
66![](/Images/OutliningIndicators/InBlock.gif)
67
constructor YellowPerson.YellowPerson;
68
begin
69
sex:='Man';
70
race:='Yellow';
71
end;
72
procedure YellowPerson.GetInfo;
73
begin
74
inherited;
75
WriteLn('the '+race+' Person Info:'+sex);
76
end;
77
{ WritePerson }
78![](/Images/OutliningIndicators/InBlock.gif)
79
procedure WritePerson.GetInfo;
80
begin
81
inherited;
82
WriteLn('the '+race+' Person Info:'+sex);
83
end;
84![](/Images/OutliningIndicators/InBlock.gif)
85
constructor WritePerson.WritePerson;
86
begin
87
sex:='Man';
88
race:='Write';
89
end;
90![](/Images/OutliningIndicators/InBlock.gif)
91
{ BlackPerson }
92![](/Images/OutliningIndicators/InBlock.gif)
93
constructor BlackPerson.BlackPerson;
94
begin
95
sex:='Man';
96
race:='Black';
97
end;
98![](/Images/OutliningIndicators/InBlock.gif)
99
procedure BlackPerson.GetInfo;
100
begin
101
inherited;
102
WriteLn('the '+race+' Person Info:'+sex);
103
end;
104![](/Images/OutliningIndicators/InBlock.gif)
105
{ PersonSimFactory }
106![](/Images/OutliningIndicators/InBlock.gif)
107
function PersonSimFactory.GetPerson(RaceType: string): Person;
108
begin
109![](/Images/OutliningIndicators/InBlock.gif)
110
if RaceType='Yellow' then
111
result:=YellowPerson.YellowPerson
112
else
113
if RaceType='Black' then
114
result:=BlackPerson.BlackPerson
115
else
116
if RaceType='Write' then
117
result:=WritePerson.WritePerson
118
else
119
result:=YellowPerson.YellowPerson;
120![](/Images/OutliningIndicators/InBlock.gif)
121
end;
122![](/Images/OutliningIndicators/InBlock.gif)
123
constructor PersonSimFactory.PersonSimFactory;
124
begin
125
inherited;
126
end;
127
{ Thinking }
128![](/Images/OutliningIndicators/InBlock.gif)
129
procedure Thinking.FreeInstance;
130
begin
131
inherited;
132
////这里赋值nil是必要的,作为delphi来说一个对象被释放之后,它的实例对应的变量并不会自动设定为nil
133
////这里涉及到VMT的实现机理,具体情况请查看相关帮助
134
GlobalThinking:=nil;
135
end;
136![](/Images/OutliningIndicators/InBlock.gif)
137
class function Thinking.GetInstance: Thinking;
138
begin
139
if not Assigned(GlobalThinking)then
140
GlobalThinking:=Thinking.Create();
141
result:= GlobalThinking;
142
end;
143![](/Images/OutliningIndicators/InBlock.gif)
144
class function Thinking.NewInstance: Tobject;
145
begin
146
if not Assigned(GlobalThinking)then
147
GlobalThinking:=Thinking(inherited NewInstance);
148
result:=GlobalThinking;
149
end;
150
procedure Thinking.Say;
151
begin
152
WriteLn('I have a thinking!');
153
end;
154
var
155
tk1,tk2,tk3:Thinking;
156
begin
157
PSF:=PersonSimFactory.PersonSimFactory;
158
PP:=PSF.GetPerson('Yellow');
159
PP.GetThinking.Say;
160
tk1:=PP.GetThinking;
161
PP.GetInfo;
162
WriteLn('![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
..');
163
PP:=PSF.GetPerson('Black');
164
PP.GetThinking.Say;
165
tk2:=PP.GetThinking;
166
PP.GetInfo;
167
WriteLn('![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
..');
168
PP:=PSF.GetPerson('Write');
169
PP.GetThinking.Say;
170
tk3:=PP.GetThinking;
171
PP.GetInfo;
172
WriteLn('![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
..error![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
.');
173
PP:=PSF.GetPerson('Write11');
174
PP.GetThinking.Say;
175
PP.GetInfo;
176
if (tk1=tk2)and(tk2=tk3)then
177
WriteLn('we are the same thinking!');
178
end.
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/None.gif)
5
![](/Images/OutliningIndicators/None.gif)
6
![](/Images/OutliningIndicators/None.gif)
7
![](/Images/OutliningIndicators/None.gif)
8
![](/Images/OutliningIndicators/None.gif)
9
![](/Images/OutliningIndicators/None.gif)
10
![](/Images/OutliningIndicators/None.gif)
11
![](/Images/OutliningIndicators/None.gif)
12
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
13
![](/Images/OutliningIndicators/InBlock.gif)
14
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
15
![](/Images/OutliningIndicators/InBlock.gif)
16
![](/Images/OutliningIndicators/InBlock.gif)
17
![](/Images/OutliningIndicators/InBlock.gif)
18
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
19
![](/Images/OutliningIndicators/InBlock.gif)
20
![](/Images/OutliningIndicators/InBlock.gif)
21
![](/Images/OutliningIndicators/InBlock.gif)
22
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
23
![](/Images/OutliningIndicators/InBlock.gif)
24
![](/Images/OutliningIndicators/InBlock.gif)
25
![](/Images/OutliningIndicators/InBlock.gif)
26
![](/Images/OutliningIndicators/InBlock.gif)
27
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
28
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
29
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
30
![](/Images/OutliningIndicators/InBlock.gif)
31
![](/Images/OutliningIndicators/InBlock.gif)
32
![](/Images/OutliningIndicators/InBlock.gif)
33
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
34
![](/Images/OutliningIndicators/InBlock.gif)
35
![](/Images/OutliningIndicators/InBlock.gif)
36
![](/Images/OutliningIndicators/InBlock.gif)
37
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
38
![](/Images/OutliningIndicators/InBlock.gif)
39
![](/Images/OutliningIndicators/InBlock.gif)
40
![](/Images/OutliningIndicators/InBlock.gif)
41
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
42
![](/Images/OutliningIndicators/InBlock.gif)
43
![](/Images/OutliningIndicators/InBlock.gif)
44
![](/Images/OutliningIndicators/InBlock.gif)
45
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
46
![](/Images/OutliningIndicators/InBlock.gif)
47
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
48
![](/Images/OutliningIndicators/InBlock.gif)
49
![](/Images/OutliningIndicators/InBlock.gif)
50
![](/Images/OutliningIndicators/InBlock.gif)
51
![](/Images/OutliningIndicators/InBlock.gif)
52
![](/Images/OutliningIndicators/InBlock.gif)
53
![](/Images/OutliningIndicators/InBlock.gif)
54
![](/Images/OutliningIndicators/InBlock.gif)
55
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
56
![](/Images/OutliningIndicators/InBlock.gif)
57
![](/Images/OutliningIndicators/InBlock.gif)
58
![](/Images/OutliningIndicators/InBlock.gif)
59
![](/Images/OutliningIndicators/InBlock.gif)
60
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
61
![](/Images/OutliningIndicators/InBlock.gif)
62
![](/Images/OutliningIndicators/InBlock.gif)
63
![](/Images/OutliningIndicators/InBlock.gif)
64
![](/Images/OutliningIndicators/InBlock.gif)
65
![](/Images/OutliningIndicators/InBlock.gif)
66
![](/Images/OutliningIndicators/InBlock.gif)
67
![](/Images/OutliningIndicators/InBlock.gif)
68
![](/Images/OutliningIndicators/InBlock.gif)
69
![](/Images/OutliningIndicators/InBlock.gif)
70
![](/Images/OutliningIndicators/InBlock.gif)
71
![](/Images/OutliningIndicators/InBlock.gif)
72
![](/Images/OutliningIndicators/InBlock.gif)
73
![](/Images/OutliningIndicators/InBlock.gif)
74
![](/Images/OutliningIndicators/InBlock.gif)
75
![](/Images/OutliningIndicators/InBlock.gif)
76
![](/Images/OutliningIndicators/InBlock.gif)
77
![](/Images/OutliningIndicators/InBlock.gif)
78
![](/Images/OutliningIndicators/InBlock.gif)
79
![](/Images/OutliningIndicators/InBlock.gif)
80
![](/Images/OutliningIndicators/InBlock.gif)
81
![](/Images/OutliningIndicators/InBlock.gif)
82
![](/Images/OutliningIndicators/InBlock.gif)
83
![](/Images/OutliningIndicators/InBlock.gif)
84
![](/Images/OutliningIndicators/InBlock.gif)
85
![](/Images/OutliningIndicators/InBlock.gif)
86
![](/Images/OutliningIndicators/InBlock.gif)
87
![](/Images/OutliningIndicators/InBlock.gif)
88
![](/Images/OutliningIndicators/InBlock.gif)
89
![](/Images/OutliningIndicators/InBlock.gif)
90
![](/Images/OutliningIndicators/InBlock.gif)
91
![](/Images/OutliningIndicators/InBlock.gif)
92
![](/Images/OutliningIndicators/InBlock.gif)
93
![](/Images/OutliningIndicators/InBlock.gif)
94
![](/Images/OutliningIndicators/InBlock.gif)
95
![](/Images/OutliningIndicators/InBlock.gif)
96
![](/Images/OutliningIndicators/InBlock.gif)
97
![](/Images/OutliningIndicators/InBlock.gif)
98
![](/Images/OutliningIndicators/InBlock.gif)
99
![](/Images/OutliningIndicators/InBlock.gif)
100
![](/Images/OutliningIndicators/InBlock.gif)
101
![](/Images/OutliningIndicators/InBlock.gif)
102
![](/Images/OutliningIndicators/InBlock.gif)
103
![](/Images/OutliningIndicators/InBlock.gif)
104
![](/Images/OutliningIndicators/InBlock.gif)
105
![](/Images/OutliningIndicators/InBlock.gif)
106
![](/Images/OutliningIndicators/InBlock.gif)
107
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
108
![](/Images/OutliningIndicators/InBlock.gif)
109
![](/Images/OutliningIndicators/InBlock.gif)
110
![](/Images/OutliningIndicators/InBlock.gif)
111
![](/Images/OutliningIndicators/InBlock.gif)
112
![](/Images/OutliningIndicators/InBlock.gif)
113
![](/Images/OutliningIndicators/InBlock.gif)
114
![](/Images/OutliningIndicators/InBlock.gif)
115
![](/Images/OutliningIndicators/InBlock.gif)
116
![](/Images/OutliningIndicators/InBlock.gif)
117
![](/Images/OutliningIndicators/InBlock.gif)
118
![](/Images/OutliningIndicators/InBlock.gif)
119
![](/Images/OutliningIndicators/InBlock.gif)
120
![](/Images/OutliningIndicators/InBlock.gif)
121
![](/Images/OutliningIndicators/InBlock.gif)
122
![](/Images/OutliningIndicators/InBlock.gif)
123
![](/Images/OutliningIndicators/InBlock.gif)
124
![](/Images/OutliningIndicators/InBlock.gif)
125
![](/Images/OutliningIndicators/InBlock.gif)
126
![](/Images/OutliningIndicators/InBlock.gif)
127
![](/Images/OutliningIndicators/InBlock.gif)
128
![](/Images/OutliningIndicators/InBlock.gif)
129
![](/Images/OutliningIndicators/InBlock.gif)
130
![](/Images/OutliningIndicators/InBlock.gif)
131
![](/Images/OutliningIndicators/InBlock.gif)
132
![](/Images/OutliningIndicators/InBlock.gif)
133
![](/Images/OutliningIndicators/InBlock.gif)
134
![](/Images/OutliningIndicators/InBlock.gif)
135
![](/Images/OutliningIndicators/InBlock.gif)
136
![](/Images/OutliningIndicators/InBlock.gif)
137
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
138
![](/Images/OutliningIndicators/InBlock.gif)
139
![](/Images/OutliningIndicators/InBlock.gif)
140
![](/Images/OutliningIndicators/InBlock.gif)
141
![](/Images/OutliningIndicators/InBlock.gif)
142
![](/Images/OutliningIndicators/InBlock.gif)
143
![](/Images/OutliningIndicators/InBlock.gif)
144
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
145
![](/Images/OutliningIndicators/InBlock.gif)
146
![](/Images/OutliningIndicators/InBlock.gif)
147
![](/Images/OutliningIndicators/InBlock.gif)
148
![](/Images/OutliningIndicators/InBlock.gif)
149
![](/Images/OutliningIndicators/InBlock.gif)
150
![](/Images/OutliningIndicators/InBlock.gif)
151
![](/Images/OutliningIndicators/InBlock.gif)
152
![](/Images/OutliningIndicators/InBlock.gif)
153
![](/Images/OutliningIndicators/InBlock.gif)
154
![](/Images/OutliningIndicators/InBlock.gif)
155
![](/Images/OutliningIndicators/InBlock.gif)
156
![](/Images/OutliningIndicators/InBlock.gif)
157
![](/Images/OutliningIndicators/InBlock.gif)
158
![](/Images/OutliningIndicators/InBlock.gif)
159
![](/Images/OutliningIndicators/InBlock.gif)
160
![](/Images/OutliningIndicators/InBlock.gif)
161
![](/Images/OutliningIndicators/InBlock.gif)
162
![](/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
163
![](/Images/OutliningIndicators/InBlock.gif)
164
![](/Images/OutliningIndicators/InBlock.gif)
165
![](/Images/OutliningIndicators/InBlock.gif)
166
![](/Images/OutliningIndicators/InBlock.gif)
167
![](/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
168
![](/Images/OutliningIndicators/InBlock.gif)
169
![](/Images/OutliningIndicators/InBlock.gif)
170
![](/Images/OutliningIndicators/InBlock.gif)
171
![](/Images/OutliningIndicators/InBlock.gif)
172
![](/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/dot.gif)
173
![](/Images/OutliningIndicators/InBlock.gif)
174
![](/Images/OutliningIndicators/InBlock.gif)
175
![](/Images/OutliningIndicators/InBlock.gif)
176
![](/Images/OutliningIndicators/InBlock.gif)
177
![](/Images/OutliningIndicators/InBlock.gif)
178
![](/Images/OutliningIndicators/InBlock.gif)
下面我们再看一个现实中的例子,连接池的问题。许多应用程序需要访问存储在数据库和其他数据源。要访问数据库中的数据,应用程序就需要建立到数据库的连接。然后,应用程序就可以使用连接进行数据访问。建立数据库连接会花相对较长的时间,因为在建立连接的过程中数据库服务器和应用程序之间必须进行协商。数据库连接也会消耗宝贵的系统资源,如CPU处理能力,内存,网络带宽。因此,很值得研究和应用技术来减少建立数据库连接的需要和活动连接数量。在这个前提下我们来看看程序代码:
1
using System;
2
using System.Drawing;
3
using System.Collections;
4
using System.ComponentModel;
5
using System.Windows.Forms;
6
using System.Data;
7![](/Images/OutliningIndicators/None.gif)
8
using System.Data.SqlClient;
9
/// <summary>
10
///============== Program Description==============
11
///Name:PoolingTester.cs
12
///Objective:PoolingTester
13
///Date:2006-04-26
14
///Written By coffee.liu
15
///================================================
16
/// </summary>
17
namespace ConnectionPooling
18
{
19
20
public class PoolingTester : System.Windows.Forms.Form
21
{
22
private System.Windows.Forms.Label label1;
23
private System.Windows.Forms.TextBox txtNumberOfConnections;
24
private System.Windows.Forms.Button btnConnect;
25
private System.Windows.Forms.Button btnDisconnect;
26
private System.Windows.Forms.CheckBox chkPooling;
27
Pooling PL;
28
/// <summary>
29
/// Required designer variable.
30
/// </summary>
31
private System.ComponentModel.Container components = null;
32![](/Images/OutliningIndicators/InBlock.gif)
33
public PoolingTester()
34
{
35
//
36
// Required for Windows Form Designer support
37
//
38
InitializeComponent();
39![](/Images/OutliningIndicators/InBlock.gif)
40
// Enable the Connect button and
41
// disable the Disconnect button
42
EnableButtons(false);
43
}
44![](/Images/OutliningIndicators/InBlock.gif)
45
/// <summary>
46
/// Clean up any resources being used.
47
/// </summary>
48
protected override void Dispose( bool disposing )
49
{
50
if( disposing )
51
{
52
if (components != null)
53
{
54
components.Dispose();
55
}
56
}
57
base.Dispose( disposing );
58
}
59![](/Images/OutliningIndicators/InBlock.gif)
60
Windows Form Designer generated code
131![](/Images/OutliningIndicators/InBlock.gif)
132
/// <summary>
133
/// The main entry point for the application.
134
/// </summary>
135
[STAThread]
136
static void Main()
137
{
138
Application.Run(new PoolingTester());
139
}
140![](/Images/OutliningIndicators/InBlock.gif)
141
// Connect to database
142
private void btnConnect_Click(object sender, System.EventArgs e)
143
{
144
//create Pooling object
145
this.PL=Pooling.Instance;
146
PL.Connect(Convert.ToInt32(txtNumberOfConnections.Text), chkPooling.Checked);
147
EnableButtons(true);
148
}
149![](/Images/OutliningIndicators/InBlock.gif)
150
// Disconnect from the database
151
private void btnDisconnect_Click(object sender, System.EventArgs e)
152
{
153
//create Pooling object
154
this.PL=Pooling.Instance;
155
PL.Disconnect();
156
EnableButtons(false);
157
}
158![](/Images/OutliningIndicators/InBlock.gif)
159
// Enable the Connect and Disconnect buttons depending on
160
// whether or not it is connected to the database
161
private void EnableButtons(bool Connected)
162
{
163
btnConnect.Enabled = !Connected;
164
btnDisconnect.Enabled = Connected;
165
}
166![](/Images/OutliningIndicators/InBlock.gif)
167
168
}
169
sealed class Pooling
170
{
171
private static bool balancer=false;
172
private Pooling(){}
173
public static readonly Pooling instance=new Pooling();
174
175
public static Pooling Instance
176
{
177
get
178
{
179
return instance;
180
}
181
}
182
private ArrayList mConnectionArray = null;
183
private const string mcConnString =
184
"Data Source=(local);" +
185
"Integrated Security=SSPI;" +
186
"Initial Catalog=Northwind";
187
public void Disconnect()
188
{
189
190
balancer=true;
191
foreach (SqlConnection cn in mConnectionArray)
192
{
193
cn.Close();
194
}
195
}
196
public void Connect(int NumberOfConnections, bool PoolConnections)
197
{
198
lock (typeof(Pooling))
199
{
200
balancer=false;
201
string ConnString = mcConnString + ";Pooling=" + PoolConnections;
202![](/Images/OutliningIndicators/InBlock.gif)
203
mConnectionArray = new ArrayList(NumberOfConnections);
204
for (int Idx = 0; Idx < NumberOfConnections; ++Idx)
205
{
206
SqlConnection cn = new SqlConnection(ConnString);
207
cn.Open();
208
mConnectionArray.Add(cn);
209
}
210
}
211
}
212
}
213
}
214![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/None.gif)
5
![](/Images/OutliningIndicators/None.gif)
6
![](/Images/OutliningIndicators/None.gif)
7
![](/Images/OutliningIndicators/None.gif)
8
![](/Images/OutliningIndicators/None.gif)
9
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
10
![](/Images/OutliningIndicators/InBlock.gif)
11
![](/Images/OutliningIndicators/InBlock.gif)
12
![](/Images/OutliningIndicators/InBlock.gif)
13
![](/Images/OutliningIndicators/InBlock.gif)
14
![](/Images/OutliningIndicators/InBlock.gif)
15
![](/Images/OutliningIndicators/InBlock.gif)
16
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
17
![](/Images/OutliningIndicators/None.gif)
18
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
19
![](/Images/OutliningIndicators/InBlock.gif)
20
![](/Images/OutliningIndicators/InBlock.gif)
21
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
22
![](/Images/OutliningIndicators/InBlock.gif)
23
![](/Images/OutliningIndicators/InBlock.gif)
24
![](/Images/OutliningIndicators/InBlock.gif)
25
![](/Images/OutliningIndicators/InBlock.gif)
26
![](/Images/OutliningIndicators/InBlock.gif)
27
![](/Images/OutliningIndicators/InBlock.gif)
28
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
29
![](/Images/OutliningIndicators/InBlock.gif)
30
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
31
![](/Images/OutliningIndicators/InBlock.gif)
32
![](/Images/OutliningIndicators/InBlock.gif)
33
![](/Images/OutliningIndicators/InBlock.gif)
34
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
35
![](/Images/OutliningIndicators/InBlock.gif)
36
![](/Images/OutliningIndicators/InBlock.gif)
37
![](/Images/OutliningIndicators/InBlock.gif)
38
![](/Images/OutliningIndicators/InBlock.gif)
39
![](/Images/OutliningIndicators/InBlock.gif)
40
![](/Images/OutliningIndicators/InBlock.gif)
41
![](/Images/OutliningIndicators/InBlock.gif)
42
![](/Images/OutliningIndicators/InBlock.gif)
43
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
44
![](/Images/OutliningIndicators/InBlock.gif)
45
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
46
![](/Images/OutliningIndicators/InBlock.gif)
47
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
48
![](/Images/OutliningIndicators/InBlock.gif)
49
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
50
![](/Images/OutliningIndicators/InBlock.gif)
51
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
52
![](/Images/OutliningIndicators/InBlock.gif)
53
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
54
![](/Images/OutliningIndicators/InBlock.gif)
55
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
56
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
57
![](/Images/OutliningIndicators/InBlock.gif)
58
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
59
![](/Images/OutliningIndicators/InBlock.gif)
60
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
131
![](/Images/OutliningIndicators/InBlock.gif)
132
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
133
![](/Images/OutliningIndicators/InBlock.gif)
134
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
135
![](/Images/OutliningIndicators/InBlock.gif)
136
![](/Images/OutliningIndicators/InBlock.gif)
137
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
138
![](/Images/OutliningIndicators/InBlock.gif)
139
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
140
![](/Images/OutliningIndicators/InBlock.gif)
141
![](/Images/OutliningIndicators/InBlock.gif)
142
![](/Images/OutliningIndicators/InBlock.gif)
143
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
144
![](/Images/OutliningIndicators/InBlock.gif)
145
![](/Images/OutliningIndicators/InBlock.gif)
146
![](/Images/OutliningIndicators/InBlock.gif)
147
![](/Images/OutliningIndicators/InBlock.gif)
148
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
149
![](/Images/OutliningIndicators/InBlock.gif)
150
![](/Images/OutliningIndicators/InBlock.gif)
151
![](/Images/OutliningIndicators/InBlock.gif)
152
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
153
![](/Images/OutliningIndicators/InBlock.gif)
154
![](/Images/OutliningIndicators/InBlock.gif)
155
![](/Images/OutliningIndicators/InBlock.gif)
156
![](/Images/OutliningIndicators/InBlock.gif)
157
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
158
![](/Images/OutliningIndicators/InBlock.gif)
159
![](/Images/OutliningIndicators/InBlock.gif)
160
![](/Images/OutliningIndicators/InBlock.gif)
161
![](/Images/OutliningIndicators/InBlock.gif)
162
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
163
![](/Images/OutliningIndicators/InBlock.gif)
164
![](/Images/OutliningIndicators/InBlock.gif)
165
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
166
![](/Images/OutliningIndicators/InBlock.gif)
167
![](/Images/OutliningIndicators/InBlock.gif)
168
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
169
![](/Images/OutliningIndicators/InBlock.gif)
170
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
171
![](/Images/OutliningIndicators/InBlock.gif)
172
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
173
![](/Images/OutliningIndicators/InBlock.gif)
174
![](/Images/OutliningIndicators/InBlock.gif)
175
![](/Images/OutliningIndicators/InBlock.gif)
176
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
177
![](/Images/OutliningIndicators/InBlock.gif)
178
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
179
![](/Images/OutliningIndicators/InBlock.gif)
180
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
181
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
182
![](/Images/OutliningIndicators/InBlock.gif)
183
![](/Images/OutliningIndicators/InBlock.gif)
184
![](/Images/OutliningIndicators/InBlock.gif)
185
![](/Images/OutliningIndicators/InBlock.gif)
186
![](/Images/OutliningIndicators/InBlock.gif)
187
![](/Images/OutliningIndicators/InBlock.gif)
188
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
189
![](/Images/OutliningIndicators/InBlock.gif)
190
![](/Images/OutliningIndicators/InBlock.gif)
191
![](/Images/OutliningIndicators/InBlock.gif)
192
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
193
![](/Images/OutliningIndicators/InBlock.gif)
194
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
195
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
196
![](/Images/OutliningIndicators/InBlock.gif)
197
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
198
![](/Images/OutliningIndicators/InBlock.gif)
199
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
200
![](/Images/OutliningIndicators/InBlock.gif)
201
![](/Images/OutliningIndicators/InBlock.gif)
202
![](/Images/OutliningIndicators/InBlock.gif)
203
![](/Images/OutliningIndicators/InBlock.gif)
204
![](/Images/OutliningIndicators/InBlock.gif)
205
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
206
![](/Images/OutliningIndicators/InBlock.gif)
207
![](/Images/OutliningIndicators/InBlock.gif)
208
![](/Images/OutliningIndicators/InBlock.gif)
209
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
210
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
211
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
212
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
213
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
214
![](/Images/OutliningIndicators/None.gif)
看看Pascal的实现:
1
unit PoolingTester1;
2![](/Images/OutliningIndicators/None.gif)
3
interface
4![](/Images/OutliningIndicators/None.gif)
5
uses
6
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
7
Dialogs, StdCtrls,ADODB, DB;
8![](/Images/OutliningIndicators/None.gif)
9
type
10
TForm1 = class(TForm)
11
Button1: TButton;
12
procedure Button1Click(Sender: TObject);
13
private
14
{ Private declarations }
15
public
16
{ Public declarations }
17
end;
18
const mcConnString ='Provider=SQLOLEDB.1;Integrated Security=SSPI;'
19
+'Persist Security Info=False;User ID=sa;Initial Catalog=Northwind';
20![](/Images/OutliningIndicators/None.gif)
21
type Pooling=class
22
private
23
mConnectionArray :TList;
24
public
25
procedure Disconnect();
26
procedure Connect(NumberOfConnections:integer;PoolConnections:boolean);
27
Class Function GetInstance():Pooling;
28
class Function NewInstance():Tobject;override;
29
procedure FreeInstance;override;
30![](/Images/OutliningIndicators/None.gif)
31
end;
32
var
33
Form1: TForm1;
34
CriticalSection:TRTLCriticalSection;
35
GlobalPooling:Pooling=nil;
36
implementation
37![](/Images/OutliningIndicators/None.gif)
38
{$R *.dfm}
39![](/Images/OutliningIndicators/None.gif)
40
{ Pooling }
41
procedure Pooling.Connect(NumberOfConnections: integer;
42
PoolConnections: boolean);
43
var
44
i:integer;
45
ADOcnArr:array of TADOConnection;
46
ConnString:string;
47
begin
48
EnterCriticalSection(CriticalSection); //进入临界区
49
mConnectionArray:=TList.Create;
50
setlength(ADOcnArr,NumberOfConnections);
51
for i:=0 to NumberOfConnections-1 do
52
begin
53
ConnString:= mcConnString + ';Pooling=' + booltostr(PoolConnections,true);
54
ADOcnArr[i]:=TADOConnection.Create(Application);
55
ADOcnArr[i].ConnectionString:=ConnString;
56
ADOcnArr[i].LoginPrompt:=false;
57
ADOcnArr[i].Connected:=true;
58
mConnectionArray.Add(ADOcnArr[i]);
59
end;
60
LeaveCriticalSection(CriticalSection); //离开临界区
61
end;
62![](/Images/OutliningIndicators/None.gif)
63
procedure Pooling.Disconnect;
64
var
65
i:integer;
66
begin
67
for i:=0 to mConnectionArray.Count-1 do
68
begin
69
TADOConnection(mConnectionArray.Items[i]).Connected:=false;
70
end;
71
end;
72![](/Images/OutliningIndicators/None.gif)
73
procedure Pooling.FreeInstance;
74
begin
75
inherited;
76
GlobalPooling:=nil;
77
end;
78![](/Images/OutliningIndicators/None.gif)
79
class function Pooling.GetInstance: Pooling;
80
begin
81
if not Assigned(GlobalPooling)then
82
GlobalPooling:=Pooling.Create;
83
result:= GlobalPooling;
84![](/Images/OutliningIndicators/None.gif)
85
end;
86![](/Images/OutliningIndicators/None.gif)
87
class function Pooling.NewInstance: Tobject;
88
begin
89
if not Assigned(GlobalPooling)then
90
GlobalPooling:=Pooling(inherited NewInstance);
91
result:=GlobalPooling;
92
end;
93![](/Images/OutliningIndicators/None.gif)
94![](/Images/OutliningIndicators/None.gif)
95
procedure TForm1.Button1Click(Sender: TObject);
96
begin
97
try
98
InitializeCriticalSection(CriticalSection); //初始化临界区
99
GlobalPooling:=Pooling.Create;
100
GlobalPooling.Connect(20,true);
101
finally
102
GlobalPooling.Disconnect;
103
end;
104
end;
105![](/Images/OutliningIndicators/None.gif)
106
end.
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/None.gif)
5
![](/Images/OutliningIndicators/None.gif)
6
![](/Images/OutliningIndicators/None.gif)
7
![](/Images/OutliningIndicators/None.gif)
8
![](/Images/OutliningIndicators/None.gif)
9
![](/Images/OutliningIndicators/None.gif)
10
![](/Images/OutliningIndicators/None.gif)
11
![](/Images/OutliningIndicators/None.gif)
12
![](/Images/OutliningIndicators/None.gif)
13
![](/Images/OutliningIndicators/None.gif)
14
![](/Images/OutliningIndicators/None.gif)
15
![](/Images/OutliningIndicators/None.gif)
16
![](/Images/OutliningIndicators/None.gif)
17
![](/Images/OutliningIndicators/None.gif)
18
![](/Images/OutliningIndicators/None.gif)
19
![](/Images/OutliningIndicators/None.gif)
20
![](/Images/OutliningIndicators/None.gif)
21
![](/Images/OutliningIndicators/None.gif)
22
![](/Images/OutliningIndicators/None.gif)
23
![](/Images/OutliningIndicators/None.gif)
24
![](/Images/OutliningIndicators/None.gif)
25
![](/Images/OutliningIndicators/None.gif)
26
![](/Images/OutliningIndicators/None.gif)
27
![](/Images/OutliningIndicators/None.gif)
28
![](/Images/OutliningIndicators/None.gif)
29
![](/Images/OutliningIndicators/None.gif)
30
![](/Images/OutliningIndicators/None.gif)
31
![](/Images/OutliningIndicators/None.gif)
32
![](/Images/OutliningIndicators/None.gif)
33
![](/Images/OutliningIndicators/None.gif)
34
![](/Images/OutliningIndicators/None.gif)
35
![](/Images/OutliningIndicators/None.gif)
36
![](/Images/OutliningIndicators/None.gif)
37
![](/Images/OutliningIndicators/None.gif)
38
![](/Images/OutliningIndicators/None.gif)
39
![](/Images/OutliningIndicators/None.gif)
40
![](/Images/OutliningIndicators/None.gif)
41
![](/Images/OutliningIndicators/None.gif)
42
![](/Images/OutliningIndicators/None.gif)
43
![](/Images/OutliningIndicators/None.gif)
44
![](/Images/OutliningIndicators/None.gif)
45
![](/Images/OutliningIndicators/None.gif)
46
![](/Images/OutliningIndicators/None.gif)
47
![](/Images/OutliningIndicators/None.gif)
48
![](/Images/OutliningIndicators/None.gif)
49
![](/Images/OutliningIndicators/None.gif)
50
![](/Images/OutliningIndicators/None.gif)
51
![](/Images/OutliningIndicators/None.gif)
52
![](/Images/OutliningIndicators/None.gif)
53
![](/Images/OutliningIndicators/None.gif)
54
![](/Images/OutliningIndicators/None.gif)
55
![](/Images/OutliningIndicators/None.gif)
56
![](/Images/OutliningIndicators/None.gif)
57
![](/Images/OutliningIndicators/None.gif)
58
![](/Images/OutliningIndicators/None.gif)
59
![](/Images/OutliningIndicators/None.gif)
60
![](/Images/OutliningIndicators/None.gif)
61
![](/Images/OutliningIndicators/None.gif)
62
![](/Images/OutliningIndicators/None.gif)
63
![](/Images/OutliningIndicators/None.gif)
64
![](/Images/OutliningIndicators/None.gif)
65
![](/Images/OutliningIndicators/None.gif)
66
![](/Images/OutliningIndicators/None.gif)
67
![](/Images/OutliningIndicators/None.gif)
68
![](/Images/OutliningIndicators/None.gif)
69
![](/Images/OutliningIndicators/None.gif)
70
![](/Images/OutliningIndicators/None.gif)
71
![](/Images/OutliningIndicators/None.gif)
72
![](/Images/OutliningIndicators/None.gif)
73
![](/Images/OutliningIndicators/None.gif)
74
![](/Images/OutliningIndicators/None.gif)
75
![](/Images/OutliningIndicators/None.gif)
76
![](/Images/OutliningIndicators/None.gif)
77
![](/Images/OutliningIndicators/None.gif)
78
![](/Images/OutliningIndicators/None.gif)
79
![](/Images/OutliningIndicators/None.gif)
80
![](/Images/OutliningIndicators/None.gif)
81
![](/Images/OutliningIndicators/None.gif)
82
![](/Images/OutliningIndicators/None.gif)
83
![](/Images/OutliningIndicators/None.gif)
84
![](/Images/OutliningIndicators/None.gif)
85
![](/Images/OutliningIndicators/None.gif)
86
![](/Images/OutliningIndicators/None.gif)
87
![](/Images/OutliningIndicators/None.gif)
88
![](/Images/OutliningIndicators/None.gif)
89
![](/Images/OutliningIndicators/None.gif)
90
![](/Images/OutliningIndicators/None.gif)
91
![](/Images/OutliningIndicators/None.gif)
92
![](/Images/OutliningIndicators/None.gif)
93
![](/Images/OutliningIndicators/None.gif)
94
![](/Images/OutliningIndicators/None.gif)
95
![](/Images/OutliningIndicators/None.gif)
96
![](/Images/OutliningIndicators/None.gif)
97
![](/Images/OutliningIndicators/None.gif)
98
![](/Images/OutliningIndicators/None.gif)
99
![](/Images/OutliningIndicators/None.gif)
100
![](/Images/OutliningIndicators/None.gif)
101
![](/Images/OutliningIndicators/None.gif)
102
![](/Images/OutliningIndicators/None.gif)
103
![](/Images/OutliningIndicators/None.gif)
104
![](/Images/OutliningIndicators/None.gif)
105
![](/Images/OutliningIndicators/None.gif)
106
![](/Images/OutliningIndicators/None.gif)
在这个例子中我们可以看到Pooling这个连接池类是个Singleton类。即无论PoolingTester被实例化多少次,我们Pooling只会被初始化一次。以上思路可以用在Web应用程序中,由于IIS本身是作为COM+应用程序安装的,就COM+而言,同一个Web应用程序中的所有网页都在一个进程中运行。因此,它们也可共享相同的连接库。