单例模式说,只需“定义一个只有一个实例的类并提供对其的全局访问点”。
换句话说,一个类必须确保只能创建单个实例,并且所有其他类都可以使用单个对象。
单例设计模式有两种形式
- 早期实例化:在加载时创建实例。
- 延迟实例化:需要时创建实例。
单例设计模式的优势
- 节省内存,因为不是在每次请求时都创建对象。只有单个实例被一次又一次地重用。
单例设计模式的使用
- 单例模式主要用于多线程和数据库应用程序。它用于日志记录、缓存、线程池、配置设置等。
单例设计模式的 Uml
如何创建单例设计模式?
要创建单例类,我们需要类的静态成员、私有构造函数和静态工厂方法。
- 静态成员:因为静态只获取一次内存,包含单例类的实例。
- 私有构造函数:它会阻止从类外部实例化 Singleton 类。
- 静态工厂方法:这提供了对 Singleton 对象的全局访问点,并将实例返回给调用者。
了解单例模式的早期实例化
在这种情况下,我们在声明静态数据成员时创建类的实例,因此在类加载时创建类的实例。
让我们看看使用早期实例化的单例设计模式的例子。
A类{
私有静态 A obj =新 A(); //早期,实例将在加载时创建
私有 A(){}
公共静态 A getA(){
返回 对象;
}
public void doSomething(){
//写你的代码
}
}
理解单例模式的惰性实例化
在这种情况下,我们在同步方法或同步块中创建类的实例,因此在需要时创建类的实例。
让我们看看使用惰性实例化的单例设计模式的简单示例。
私有静态 一个对象;
私有 A(){}
公共静态 A getA(){
如果 (对象== 空){
同步(单例。类){
如果 (对象== 空){
obj = 新 单例();//实例将在请求时创建
}
}
}
返回 对象;
}
public void doSomething(){
//写你的代码
}
}
理解单例模式的真实例子
unit SingletonPatternImpl;
interface
uses ADODB, System.SysUtils, vcl.dialogs;
type
TADOSingleton = class
//Step 1
// create a JDBCSingleton class.
//static member holds only one instance of the JDBCSingleton class.
private
class var FADO: TADOSingleton ;
//JDBCSingleton prevents the instantiation from any other class.
constructor Create;
class function getConnection: TADOConnection;static;
//Now we are providing gloabal point of access.
public
class function getInstance: TADOSingleton; static;
function insert( Aname, Apass : String):integer;
end;
implementation
constructor TADOSingleton.Create;
begin
//nothing
end;
function TADOSingleton.insert( Aname, Apass : String):integer;
var
c : TADOConnection;
cmd : TADOCommand;
recordCounter : integer;
SQL: string;
begin
c := nil;
try
recordCounter := 0;
try
c := Self.getConnection;
SQL := 'insert into userdata(uname,upassword) values(:uname, :upassword)';
cmd.Connection := c;
cmd.CommandText := SQL;
cmd.Parameters.ParamByName('uname').Value := Aname;
cmd.Parameters.ParamByName('upassword').Value := Apass;
recordCounter := cmd.Execute(SQL).RecordCount;
except on E: Exception do
ShowMessage(E.Message);
end;
finally
if(c<> nil) then
c.close();
if cmd <> nil then
cmd.CommandText := '';
end;
Result := recordCounter;
end;
class function TADOSingleton.getConnection: TADOConnection;
begin
Result := TADOConnection.Create(nil);
Result.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\Test.mdb;Persist Security Info=False';
end;
class function TADOSingleton.getInstance:TADOSingleton;
begin
if FADO = nil then
begin
FADO := TADOSingleton.Create;
end;
Result := FADO;
end;
end.