如何创建带参数的单件

shinidge 2009-04-13 12:27:35
本人为了使用某个唯一对象,使用了单件模式.又因为这个对象需要参数才能示例化,于是我又写了个初始化函数,虽然程序后来是起来.但是本人总觉得这样设计有些欠缺不伦不类.因为没法保证这个初试化函数一定能被调用而且只调用一次. 请教:设计模式中有没有一种类似于单件,但是可以使用参数的模式?
...全文
133 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
shinidge 2009-04-13
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 hairetz 的回复:]
你产生新单件,要提供参数不是很正常吗?
你不能一次把话说清楚啊,或者讲个例子,你想干嘛?
[/Quote]
给出我过去一个折中的方法:
class single
{
public:
static Initialize ( 参数表);
static GetInstance();
.....
};

首先在某处用静态方法 Initialize(参数表) 初试化这个单件, 然后以后就和普通单件一样, 用GetInstance()方法来获得这个单件. 这个方法的缺点是没法保证只Initialize一次,第二个缺点是, 在调用GetInstance()之前, 必须Initialize(),否则将出错
mengde007 2009-04-13
  • 打赏
  • 举报
回复
工厂模式可以可以推迟子类化的执行。何不结合一下……
shinidge 2009-04-13
  • 打赏
  • 举报
回复
不好意思,可能我的表达有问题.那我把这个问题详细地跟你说一下:
我用的是一个directx对象, 然后它需要一个窗口句柄来初试化. 显然这个句柄一开始是不知道的,由别的窗口对象给出. 当然这个directx对象只能初试化一次, 如果两次初试化,将出错. 初试化一次后, directx对象中的所有方法都能使用了,相反若没化过, 调用directx对象的某些方法将出错.
Paradin 2009-04-13
  • 打赏
  • 举报
回复
意思好像是实例在运行过程中必须是严格的单个。但每次用到时(GetInstance)又要根据参数设置内部状态,而lz想靠构造器来做到这一点?
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 shinidge 的回复:]
引用 1 楼 hairetz 的回复:
你在接口里提供参数到构造函数不就可以了吗?

跟普通的单件就是多了个参数吗。

这位的意思是这样么 GetInstance()中提供参数给构造函数? 第一次用到的时候提供或许没错, 但是以后每次用的时候都需要提供参数,这不是很奇怪么?
[/Quote]

你产生新单件,要提供参数不是很正常吗?
你不能一次把话说清楚啊,或者讲个例子,你想干嘛?
shinidge 2009-04-13
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 Paradin 的回复:]
那就不应该用singleton了
要不再加个
Class::SetParam(...)
[/Quote]
请问设计模式中没有这种经典的模式么?
Paradin 2009-04-13
  • 打赏
  • 举报
回复
那就不应该用singleton了
要不再加个
Class::SetParam(...)
shinidge 2009-04-13
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 Sco_field 的回复:]
那什么时候能知道?

引用 2 楼 shinidge 的回复:
引用 1 楼 hairetz 的回复:
你在接口里提供参数到构造函数不就可以了吗?

跟普通的单件就是多了个参数吗。

是这样的,这个参数一开始是不知道的,没法在一开始就指定
[/Quote]
是这样的,运行的过程中给出
shinidge 2009-04-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hairetz 的回复:]
你在接口里提供参数到构造函数不就可以了吗?

跟普通的单件就是多了个参数吗。
[/Quote]
这位的意思是这样么 GetInstance()中提供参数给构造函数? 第一次用到的时候提供或许没错, 但是以后每次用的时候都需要提供参数,这不是很奇怪么?
Sco_field 2009-04-13
  • 打赏
  • 举报
回复
那什么时候能知道?

[Quote=引用 2 楼 shinidge 的回复:]
引用 1 楼 hairetz 的回复:
你在接口里提供参数到构造函数不就可以了吗?

跟普通的单件就是多了个参数吗。

是这样的,这个参数一开始是不知道的,没法在一开始就指定
[/Quote]
Sco_field 2009-04-13
  • 打赏
  • 举报
回复
少写了个参数。
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 shinidge 的回复:]
引用 1 楼 hairetz 的回复:
你在接口里提供参数到构造函数不就可以了吗?

跟普通的单件就是多了个参数吗。

是这样的,这个参数一开始是不知道的,没法在一开始就指定
[/Quote]

什么意思,讲具体点。
Sco_field 2009-04-13
  • 打赏
  • 举报
回复
初始化函数放在构造函数里?


CDemoInstance::CDemoInstance()
{
...
m_cpGlbVrbl = m_cpGlbVrbl->Instance();
}

static Cglobalvariable* Instance()
{
if ( m_pInstance == 0)
{
m_pInstance = new Cglobalvariable;

//初始化
Cglobalvariable();
}
return m_pInstance;
}

  • 打赏
  • 举报
回复

class A
{
public:

static void init()
{
if (NULL != a)
a = NULL;
}

static A *GetSingleton(int da)
{
static bool inited = false;
if (!inited)
{
a = new A(da);
inited = true;
cout << "create a instance of A,and the paremeter is " <<a->data<<endl;
}
else
{
cout << "Can't create instance,a instance already exist" <<endl;
return NULL;
}
return a;
}

static void Release()
{
if (NULL != a)
{
delete a;
a = NULL;
}
}

private:
int data;
static A *a;
A(int d):data(d){} //构造里提供参数不就可以了吗?
~A(){}
};

A* A::a = NULL;

int main()
{
A::init();
A* aa=A::GetSingleton(5);
A* BB=A::GetSingleton(4);
}

Paradin 2009-04-13
  • 打赏
  • 举报
回复
GetInstance(...)
shinidge 2009-04-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hairetz 的回复:]
你在接口里提供参数到构造函数不就可以了吗?

跟普通的单件就是多了个参数吗。
[/Quote]
是这样的,这个参数一开始是不知道的,没法在一开始就指定
  • 打赏
  • 举报
回复
你在接口里提供参数到构造函数不就可以了吗?

跟普通的单件就是多了个参数吗。
x360995630 2009-04-13
  • 打赏
  • 举报
回复
已经有答案了
ch1oE 2009-04-13
  • 打赏
  • 举报
回复
单件带参,有什么问题么。。?
如果你希望只初始化一次,那就单件的内部绕一下,例如:

Enum SingleType
{
none,
type1,
type2
};

初始化过程放在一个类似Init(SingleType eType)的地方

然后通过类似setconfig的接口来设置eType,设置的同时调用一次Init(eType)就可以了。

这样就没有问题了啊。
本身单件就应该是可以随时设置参数的,不然不是很郁闷,。。
shinidge 2009-04-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hairetz 的回复:]
C/C++ code
class A
{
public:

static void init()
{
if (NULL != a)
a = NULL;
}

static A *GetSingleton(int da)
{
static bool inited = false;
if (!inited)
{
a = new A(da);
inited = true;
cout << "create a instance of A,and the paremeter is " <<a->data<<endl;
}
e…
[/Quote]
不好意思,我可能问题没说清楚,我实际只要初试化一次就够了, 并非每次都要参数来获取实例.详细见LS

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧