单例设计模式

单例模式说,只需“定义一个只有一个实例的类并提供对其的全局访问点”。

换句话说,一个类必须确保只能创建单个实例,并且所有其他类都可以使用单个对象。

单例设计模式有两种形式

  • 早期实例化:在加载时创建实例。
  • 延迟实例化:需要时创建实例。

单例设计模式的优势

  • 节省内存,因为不是在每次请求时都创建对象。只有单个实例被一次又一次地重用。

单例设计模式的使用

  • 单例模式主要用于多线程和数据库应用程序。它用于日志记录、缓存、线程池、配置设置等。

单例设计模式的 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.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值