最近在听微软WebCast网络系列讲座之C#面向对象设计模式纵横谈,初步了解了设计模式的基本知识,现在简单的做一下每种模式笔记,供以后开发过程中作一参考。
模式分类
从目的来看:
– 创建型(Creational)模式:负责对象创建。
– 结构型(Structural)模式:处理类与对象间的组合。
– 行为型(Behavioral)模式:类与对象交互中的职责分配。
从范围来看:
– 类模式处理类与子类的静态关系。
– 对象模式处理对象间的动态关系。
Singleton 单件(创建型模式)
使用动机:在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。(这应该是类设计者的责任,而不是使用者的责任。)
意图:保证一个类仅有一个实例,并提供一个该实例的全局访问点。
适用性:
1、当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
2、当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
单线程Singleton 模式实现:
class Singleton
{
private static Singleton _instance=null;
private Singleton(){}
public static Singleton Instance()
{
if (_instance == null)
_instance = new Singleton();
return _instance;
}
}
单线程Singleton模式的几个要点:
• Singleton模式中的实例构造器可以设置为protected以允许子类派生。
• Singleton模式一般不要支持ICloneable接口,因为这可能会导致多个对象实例,与Singleton模式的初衷违背。
• Singleton模式一般不要支持序列化,因为这也有可能导致多个对象实例,同样与Singleton模式的初衷违背。
• Singletom模式只考虑到了对象创建的管理,没有考虑对象销毁的管理。就支持垃圾回收的平台和对象的开销来讲,我们一般没有必要对其销毁进行特殊的管理。
• 不能应对多线程环境:在多线程环境下,使用Singleton模式仍然有可能得到Singleton类的多个实例对象。
多线程Singleton 模式实现:
class Singleton
{
private static volatile Singleton _instance = null;
private static object lockHelper = new object();
private Singleton(){}
public static Singleton Instance()
{
if (_instance == null)
{
lock(lockHelper)//双检查
{
if (_instance == null)
{
_instance = new Singleton();
}
}
}
return _instance;
}
}
或
class Singleton
{
private static readonly Singleton _instance = new Singleton();
private Singleton(){}
}
Singleton模式扩展
• 将一个实例扩展到n个实例,例如对象池的实现。
例:一个多例数据库访问类:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Collections;
using System.Diagnostics;
using System.Windows.Forms;
namespace DataAccess
{
/// <summary>
/// 数据库查询
/// </summary>
/// <author>
/// Caveman_lyhu/2005.11
/// </author>
public class DBQuery
{
private static DBQuery _instance = null;
private SqlConnection m_objConn = null; //SQL Server 数据库打开的连接
private static Hashtable hTable = new Hashtable();
/// <summary>
/// 数据库类型[连接哪个数据库]
/// </summary>
public enum DBType
{
/// <summary>
/// 继电保护系统数据库
/// </summary>
PowerRelay,
/// <summary>
/// 工作票数据库
/// </summary>
GZP,
/// <summary>
/// 整定系统数据库
/// </summary>
AdjustValue,
/// <summary>
/// EMIS系统数据库
/// </summary>
EMIS
}
private DBQuery(DBQuery.DBType dbType)
{
try
{
switch(dbType)
{
case DBType.AdjustValue:
m_objConn = new SqlConnection(ConfigValue.DBconStrAdjustValue);
break;
case DBType.EMIS:
m_objConn = new SqlConnection(ConfigValue.DBconStrEMIS);
break;
case DBType.GZP:
m_objConn = new SqlConnection(ConfigValue.DBconStrGzp);
break;
case DBType.PowerRelay:
m_objConn = new SqlConnection(ConfigValue.DBConStrPowerRelay);
break;
}
m_objConn.Open();
}
catch(Exception ex)
{
LogWriter.Info("数据库连接错误:" + ex.Message);
MessageBox.Show("数据库连接错误,请检查配置文件!","系统提示:",MessageBoxButtons.OK,MessageBoxIcon.Error);
return;
}
}
/// <summary>
/// 得到一个数据库查询实例
/// </summary>
/// <returns></returns>
/// <example>
/// 查询“工作票”数据库调用方法:
/// DataTable dTable = DBQuery.GetInstance(DBQuery.DBType.GZP).Query(strSQL);
/// 查询“整定系统”数据库调用方法:
/// DataTable dTable = DBQuery.GetInstance(DBQuery.DBType.AdjustValue).Query(strSQL);
/// </example>
public static DBQuery GetInstance(DBQuery.DBType dbType)
{
if ( !hTable.Contains(dbType))
{
_instance = new DBQuery(dbType);
hTable.Add(dbType,_instance);
}
return (DBQuery)hTable[dbType];
}
/// <summary>
/// 执行SELECT语句查询
/// </summary>
/// <param name="selectSql"></param>
/// <returns></returns>
public DataTable Query(string sSelectSQL)
{
DataTable dTable;
...
return dTable;
}
/// <summary>
/// 执行非SELECT语句查询
/// </summary>
/// <param name="updataSql"></param>
/// <returns>true(成功)或false(失败)</returns>
public bool Update(string updataSql)
{
...
}
/// <summary>
/// 开始事务
/// </summary>
private void BeginTransaction()
{
...
}
/// <summary>
/// 提交事务
/// </summary>
private void CommitTransaction()
{
...
}
/// <summary>
/// 事务回滚
/// </summary>
private void RollbackTransaction()
{
...
}
/// <summary>
/// 关闭数据库连接
/// </summary>
private void CloseConnection()
{
...
}
}
}