使用场景:
有一间黑色的屋子,里边有一盏灯。当第一个人进屋的时候灯会打开,之后的人进来则不用再次打开了,因为已经开过了。当屋子里的所有人离开的时候,灯则会关闭。
class Light
{
public void Open()
{
Log.I("灯打开了");
}
public void Close()
{
Log.I("灯关闭了");
}
}
class Room
{
private Light mLight = new Light();
private int mPeopleCount = 0;
public void EnterPeople()
{
if (mPeopleCount == 0)
{
mLight.Open();
}
++mPeopleCount;
Log.I("一个人走进房间,房间里当前有{0}个人",mPeopleCount);
}
public void LeavePeople()
{
--mPeopleCount;
if (mPeopleCount == 0)
{
mLight.Close();
}
Log.I("一个人走出房间,房间里当前有{0}个人", mPeopleCount);
}
}
代码如上,很简单,没什么好说的。
这个例子比较接近生活,假如再换个例子,把Light对象换成资源对象,其开灯对应加载资源,关灯对应卸载资源。而屋子则是对应资源管理器,EnterPeople对应申请资源对象,LeavePeople对应归还资源对象。这样只管在各个界面中申请各个资源,只要在界面关闭的时候归还各个资源对象就可以不用关心资源的加载和卸载了.
简易计数器实现
public interface IRefCounter
{
int RefCount { get; }
void Retain(object refOwner = null);
void Release(object refOwner = null);
}
public class SimpleRC : IRefCounter
{
public SimpleRC()
{
RefCount = 0;
}
public int RefCount { get; private set; }
public void Retain(object refOwner = null)
{
++RefCount;
}
public void Release(object refOwner = null)
{
--RefCount;
if (RefCount == 0)
{
OnZeroRef();
}
}
protected virtual void OnZeroRef()
{
}
}