设计模式-原型模式、单例模式
2016-03-31 11:50
302 查看
原型模式:
该模式用于克隆对象,有2种方式
浅克隆(不复制引用类型)
深克隆(将值类型、引用类型均复制)
C#中提供了MemberwiseClone()方法用于浅克隆和ICloneable接口用于实现深克隆
[b]单例模式 :[/b]
饿汉式单例模式
public class TaskManager
{
//静态成员
private static TaskManager instance=new TaskManager();
//私有构造函数,用于防止外部创建对象
private TaskManager()
{
tid = "1001";
Console.WriteLine("tid:" + tid + "正在创建进程...");
}
//获取单例实例的 静态方法
public static TaskManager GetInstance()
{
Console.WriteLine("已存在进程tid:" + instance.tid + ",不再创建新进程");
return instance;
}
//其他成员和方法
private string tid;
public void Open()
{
Console.WriteLine("tid:" + tid+" 正在打开任务管理器..." );
}
public void Close()
{
Console.WriteLine("tid:" + tid + " 正在关闭任务管理器...");
}
}
懒汉式单例模式
//懒汉式单例模式
public class TaskManager
{
//静态成员
private static TaskManager instance;
//私有构造函数,用于防止外部创建对象
private TaskManager()
{
tid = "1001";
Console.WriteLine("tid:" + tid + "正在创建进程...");
}
//获取单例实例的 静态方法
public static TaskManager GetInstance()
{
if (instance == null)
{
instance = new TaskManager();
}
else
{
Console.WriteLine("已存在进程tid:" + instance.tid + ",不再创建新进程");
}
return instance;
}
//其他成员和方法
private string tid;
public void Open()
{
Console.WriteLine("tid:" + tid+" 正在打开任务管理器..." );
}
public void Close()
{
Console.WriteLine("tid:" + tid + " 正在关闭任务管理器...");
}
}
线程安全的 懒汉单例模式
//线程安全的 懒汉单例模式
public class TaskManager
{
//静态成员
private static TaskManager instance;
//同步锁
private static readonly object myLock = new object();
//私有构造函数,用于防止外部创建对象
private TaskManager()
{
tid = "1001";
Console.WriteLine("tid:" + tid + "正在创建进程...");
}
//获取单例实例的 静态方法
public static TaskManager GetInstance()
{
if (instance == null)
{
//同步代码块
lock(myLock)
{
//再次判断
if (instance == null)
instance = new TaskManager();
}
}
else
{
Console.WriteLine("已存在进程tid:" + instance.tid + ",不再创建新进程");
}
return instance;
}
//其他成员和方法
private string tid;
public void Open()
{
Console.WriteLine("tid:" + tid+" 正在打开任务管理器..." );
}
public void Close()
{
Console.WriteLine("tid:" + tid + " 正在关闭任务管理器...");
}
}
客户端代码
该模式用于克隆对象,有2种方式
浅克隆(不复制引用类型)
深克隆(将值类型、引用类型均复制)
C#中提供了MemberwiseClone()方法用于浅克隆和ICloneable接口用于实现深克隆
[b]单例模式 :[/b]
饿汉式单例模式
public class TaskManager
{
//静态成员
private static TaskManager instance=new TaskManager();
//私有构造函数,用于防止外部创建对象
private TaskManager()
{
tid = "1001";
Console.WriteLine("tid:" + tid + "正在创建进程...");
}
//获取单例实例的 静态方法
public static TaskManager GetInstance()
{
Console.WriteLine("已存在进程tid:" + instance.tid + ",不再创建新进程");
return instance;
}
//其他成员和方法
private string tid;
public void Open()
{
Console.WriteLine("tid:" + tid+" 正在打开任务管理器..." );
}
public void Close()
{
Console.WriteLine("tid:" + tid + " 正在关闭任务管理器...");
}
}
懒汉式单例模式
//懒汉式单例模式
public class TaskManager
{
//静态成员
private static TaskManager instance;
//私有构造函数,用于防止外部创建对象
private TaskManager()
{
tid = "1001";
Console.WriteLine("tid:" + tid + "正在创建进程...");
}
//获取单例实例的 静态方法
public static TaskManager GetInstance()
{
if (instance == null)
{
instance = new TaskManager();
}
else
{
Console.WriteLine("已存在进程tid:" + instance.tid + ",不再创建新进程");
}
return instance;
}
//其他成员和方法
private string tid;
public void Open()
{
Console.WriteLine("tid:" + tid+" 正在打开任务管理器..." );
}
public void Close()
{
Console.WriteLine("tid:" + tid + " 正在关闭任务管理器...");
}
}
线程安全的 懒汉单例模式
//线程安全的 懒汉单例模式
public class TaskManager
{
//静态成员
private static TaskManager instance;
//同步锁
private static readonly object myLock = new object();
//私有构造函数,用于防止外部创建对象
private TaskManager()
{
tid = "1001";
Console.WriteLine("tid:" + tid + "正在创建进程...");
}
//获取单例实例的 静态方法
public static TaskManager GetInstance()
{
if (instance == null)
{
//同步代码块
lock(myLock)
{
//再次判断
if (instance == null)
instance = new TaskManager();
}
}
else
{
Console.WriteLine("已存在进程tid:" + instance.tid + ",不再创建新进程");
}
return instance;
}
//其他成员和方法
private string tid;
public void Open()
{
Console.WriteLine("tid:" + tid+" 正在打开任务管理器..." );
}
public void Close()
{
Console.WriteLine("tid:" + tid + " 正在关闭任务管理器...");
}
}
客户端代码
class Program { static void Main(string[] args) { //模拟 用户开启了2次任务管理器 TaskManager taskManager1 = TaskManager.GetInstance(); TaskManager taskManager2 = TaskManager.GetInstance(); taskManager1.Open(); taskManager2.Close(); } }
相关文章推荐
- CentOS 7 修改网卡名称为eth0
- ArrayList 集合练习
- 不需要sudo打开wireshark
- 1.备忘录模式
- CentOS 7 修改网卡名称为eth0
- unity 摄像头跟踪目标
- Java微信公众平台开发(四)——回复消息的分类及实体的创建
- 递归二 - 汉诺塔
- 获取App的包名
- 史上最全的CSS hack方式一览
- same-tree
- 字符串第一次包含目标字符集合元素的最小范围
- Web API:将FlexChart导出为图片
- MySQL INFORMATION_SCHEMA 使用
- Java微信公众平台开发(三)——接收消息的分类及实体的创建
- String的equals与Object的equals的区别
- 使用redis缓存网站首页
- 使用redis缓存网站首页
- Centos添加Windows/Centos双系统启动
- ORACLE RAC 的启动和关闭顺序