浅析软件项目开发中的单件模式

http://tech.ddvip.com   2008年01月22日    社区交流

内容摘要:单件(Singleton)模式是设计模式的一个典型且相对简单的构造型模式。本文举实例说明单件模式的主要注意事项和多线程环境下的单件模式。

  如果工程上要对NLB集群中的Singleton对象继续保持其“单件”,那么可以采用集中保存其属性信息(或State信息)。不仅如此,对于如果需要通过外界修改这些属性,那么还需要在外部增加一个串行的集中属性信息更新机制。

浅析软件项目开发中的单件模式

  图:NLB环境下的多节点Singleton实现

  对于跨AppDomain的访问,往往需要把复杂的对象通过串行化后进行传递,但是串行化本身会导致单件特性的破坏。因为等于串行化完成了单件对象的“深拷贝”,所以一定不能对于单件对象声明SerializableAttribute属性。下面是一个错用情形示例——为单件类型增加了SerializableAttribute属性。

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
namespace VisionLogic.DesignPattern.Practice
...{
[Serializable]
public class Singleton
...{
private static Singleton instance;
private static BinaryFormatter formatter = new BinaryFormatter();
private Singleton() ...{ }
public static Singleton Instance
...{
get
...{
if (instance == null)
...{
instance = new Singleton();
instance.data = 0;
}
return instance;
}
}
/**//// <summary>
/// 共享的实例数据
/// </summary>
private int data;
public int Data
...{
get ...{ return data; }
set ...{ data = value; }
}
/**//// <summary>
/// 把Singleton 实例通过二进制串行化为字符串
/// </summary>
/// <param name="graph"></param>
/// <returns></returns>
public static string SerializeToString(Singleton graph)
...{
MemoryStream memoryStream = new MemoryStream();
formatter.Serialize(memoryStream, graph);
Byte[] arrGraph = memoryStream.ToArray();
return Convert.ToBase64String(arrGraph);
}
/**//// <summary>
/// 通过二进制反串行化从字符串回复出Singleton 实例
/// </summary>
/// <param name="serializedGraph"></param>
/// <returns></returns>
public static Singleton DeserializeFromString(string serializedGraph)
...{
Byte[] arrGraph = Convert.FromBase64String(serializedGraph);
MemoryStream memoryStream = new MemoryStream(arrGraph);
return (Singleton)formatter.Deserialize(memoryStream);
}
}
}
using System;
using System.Diagnostics;
using VisionLogic.DesignPattern.Practice;
namespace VisionLogic.DesignPattern.Practice.Client
...{
class Program
...{
static void Main(string[] args)
...{
Singleton instance1 = Singleton.Instance;
string serializedInstance =             
Singleton.SerializeToString(instance1);
Singleton instance2 =             
Singleton.DeserializeFromString(serializedInstance);
instance1.Data = 30;
Trace.WriteLine(instance2.Data);
instance2.Data = 15;
Trace.WriteLine(instance1.Data);
}
}
}
结果:
0
30

  示例8:错用SerializableAttribute导致的单件特性的丧失

来源:IT168    作者:王翔    责编:豆豆技术应用

正在加载评论...