【說明】
單件模式是一種用於確保整個應用程序中只有一個類實例。
想想我們的系統中有哪些方面可以應用到單件模式,比如大家常說的連接(ADOConnection)共享,其實就是指的單件模式。
【MyBean中的單件模式】
MyBean中插件一旦成為單件模式,框架就會幫你接管對象的生命周期。你每次調用getBean都只會產生一份實例,也就是說對象只會創建一次,不管是窗體插件還是無UI的邏輯插件。
MyBean中可以通過兩種方式使插件成為單件模式。
1.最簡單的一種是注冊的時候,參數選定為單件模式,也是最簡單明了的一種方式。
library diocp_bean; uses SysUtils, Classes, mybean.core.beanFactory, uRemoteServerDIOCPImpl in '..\..\Service\uRemoteServerDIOCPImpl.pas'; {$R *.res} begin beanFactory.RegisterBean('diocpRemoteSvr', TRemoteServerDIOCPImpl).Singleton := true; end.
2.通過配置文件可以配置插件為單據模式:
假如上面的插件注冊的是普通的模式,而且這個插件你沒有源碼,你想直接使用,又想是單件模式怎麼辦?你可以使用配置文件達到
// 如果注冊是這樣的, beanFactory.RegisterBean('diocpRemoteSvr', TRemoteServerDIOCPImpl)
{ list: [ { "id":"dbSERVER", //getBean的時候的參數 "pluginID":"diocpRemoteSvr", //如果與id一致可以進行忽略 "lib":"diocp_bean.dll", //宿主文件名 "singleton":true, //單件模式 "config": { "host":"127.0.0.1", "port":9983 } }, { "id":"imSERVER", //getBean的時候的參數 "pluginID":"diocpRemoteSvr", //如果與id一致可以進行忽略 "lib":"diocp_bean.dll", //宿主文件名 "singleton":true, //單件模式 "config": { "host":"127.0.0.1", "port":9985 } }, ] }
可以看出上面調用的時候可以完成2個插件,他們使用的實現都是一樣的,想想如果我們有兩個數據庫連接,一個連接業務數據庫,一個連接配置數據庫,其實他們的實現是一樣的,只是連接的地址和端口不一樣。
【單件模式的應用】
單件模式在MyBean可以引用比較廣泛,系統中只需要一個主窗體,有的選取窗體也只需要一個等等。。。大家可以想想你項目中的單件模式,之前是怎麼樣處理的
package test;
public class Singleton {
private Singleton s;
private Singleton()
{
}
public static Singleton getSigleton()
{
if(s==null)s=new Singleton();
return s;
}
}
這就是一個單例模式,我想應該不用注釋了,原理就是這個類的構造方法private了,所有在外邊不能調用,也就不能new Singleton();得到實例,那麼
想得到實例就得調用它的靜態方法getSigleton();即Singleton.getSigleton();就會返回一個Singleton的實例,注意此方法中的語句,即如果你是第一次調用這個方法那麼它會給你new一個實例,以後再調用得到的都是這個實例,也就是說從始至終就只有一個Singleton的實例,這就是單例模式。
class CAlone
{
public:
static CAlone &GetOne(void)
{
static CAlone aObj;
return aObj;
}
private:
CAlone(){};
};