单例模式的目的是保证类在系统中只被实例化一次,由该唯一的实例来为系统提供服务.单例模式主要用于保证服务的统一,比如获取统一的编号服务,模仿Oracle的序列生成等.但单例的使用需要谨慎,特别是在需要作负载均衡的地方,因为这种程序级的单例模式实际上只能保证在一个应用中为单例.如果被多个应用加载,还是会被多次实例化.
同时如果采用懒汉式还需要注意线程安全.
多例模式跟单例模式类似,但在实现上要复杂很多,需要维护自己的实例池和分配使用策略,还包括使用状态等的维护,多例模式主要用于有限个资源的管理,
比如数据库连接池等。
下面是单例模式例子:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
//单例模式:就是保证系统中只实例化一个实例。
namespace MyBaseStudy
{
//模式1
class SingleTon_1
{
private double _value = 0;
public double Value
{
get
{
return _value;
}
set
{
this._value = value;
}
}
private static SingleTon_1 _instance = new SingleTon_1();
//在单例模式中需要将构造函数设为Protected或者private,防止其它类来使用构造函数进行实例化。
private SingleTon_1()
{
}
public static SingleTon_1 GetInstance()
{
return _instance;
}
}
//模式2 称为懒汉式,需要保证线程安全
class SingleTon_2
{
private double _value = 0;
public double Value
{
get
{
return _value;
}
set
{
this._value = value;
}
}
private static SingleTon_2 _instance = null;
private static readonly object padlock = new object();
//在单例模式中需要将构造函数设为Protected或者private,防止其它类来使用构造函数进行实例化。
private SingleTon_2()
{
}
//这种缩开销比较大,因为每次进来都需要锁。
public static SingleTon_2 GetInstanceA()
{
lock (padlock)
{
if (_instance == null)
{
_instance = new SingleTon_2();
}
return _instance;
}
}
//只有在没有实例化的情况下才加锁。
public static SingleTon_2 GetInstanceB()
{
if (_instance == null)
{
lock (padlock)
{
if (_instance == null)
{
_instance = new SingleTon_2();
}
}
}
return _instance;
}
}
//一般类
class CommClass
{
private double _value = 0;
public double Value
{
get
{
return _value;
}
set
{
this._value = value;
}
}
}
//利用泛型来实现单例类的构建,好处是要使用单例模式的类本身可以是普通类,可用于复用。
public sealed class SingleTon_3<T> where T : new()
{
public static T GetInstance()
{
return SingleTonCreator.Instance;
}
private class SingleTonCreator
{
internal static readonly T Instance = new T();
static SingleTonCreator()
{
}
}
}
public class SingleTonTest
{
public static void test()
{
SingleTon_1.GetInstance().Value++;
MessageBox.Show(SingleTon_1.GetInstance().Value.ToString());
SingleTon_1.GetInstance().Value++;
MessageBox.Show(SingleTon_1.GetInstance().Value.ToString());
SingleTon_2.GetInstanceA().Value++;
MessageBox.Show(SingleTon_2.GetInstanceA().Value.ToString());
SingleTon_2.GetInstanceA().Value++;
MessageBox.Show(SingleTon_2.GetInstanceA().Value.ToString());
SingleTon_2.GetInstanceB().Value++;
MessageBox.Show(SingleTon_2.GetInstanceB().Value.ToString());
SingleTon_2.GetInstanceB().Value++;
MessageBox.Show(SingleTon_2.GetInstanceB().Value.ToString());
SingleTon_3<CommClass>.GetInstance().Value++;
MessageBox.Show(SingleTon_3<CommClass>.GetInstance().Value.ToString());
SingleTon_3<CommClass>.GetInstance().Value++;
MessageBox.Show(SingleTon_3<CommClass>.GetInstance().Value.ToString());
}
}
}
分享到:
相关推荐
李建忠老师的设计模式-单例模式讲解,示例以C++编程语言呈现。
设计模式-单例模式脑图
ava常用设计模式-单例模式
Java设计模式-单例模式详解
常见设计模式-单例模式
设计模式-单例模式(讲解及其实现代码)
Java-设计模式-单例模式-实现源码(简单实现、双重检查锁、静态内部类、枚举类)
c++设计模式-创建型模式-单例模式源码,懒汉式 饿汉式源码,qt工程,单例模式线程安全问题,单例模式实现方式
java设计模式中的单例模式,而单例模式又分为饿汉模式和懒汉模式
设计模式--单例模式java例子
JAVA-设计模式-创建型模式-单例模式
设计模式 java设计模式-单例.pdf
android 单例模式 干货 告诉你哪种单例模式最实用 最好用 不再迷茫
最简单的PHP设计模式,单例模式。大家可以参考下。
作者以初学者视角出发,带你一个例子读懂程序设计模式。让设计模式不再难学!C#版本,从设计需求出发为您逐层揭开设计模式的那些事。
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段...
设计模式 For iOS-02-单例模式 严 格 严谨 详细的单例模式。
本文档,详细的描述了单例模式,有类图,java代码实例,以及讲解、注意点,通过这份文档可以让你很容易理解单例设计模式。