• 定义

  单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类,它提供全局访问的方法。单例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行想整个系统提供这个实例。

  UML类图如下:

  

  类和对象之间的关系为:

  1.Singleton(单例):提供了一个instance的方法,让客户可以使用它的唯一实例。内部实现只生成一个实例。

  典型应用的顺序图如下:

  

  • 实例1——负载均衡控制器

   负载均衡器的实现就是单一的实例,对服务器的所以请求都通过一个了解服务器的状态对象来控制,因为个别的服务器可能会动态地开关。这个单例的类图如下:

  

  

代码

class LoadBalancer
{
private static LoadBalancer balancer;
private ArrayList servers = new ArrayList();
private Random random = new Random();
//构造函数
protected LoadBalancer()
{
servers.Add("ServerI");
servers.Add("ServerII");
servers.Add("ServerIII");
servers.Add("ServerIV");
servers.Add("ServerV");
}
public static LoadBalancer GetLoadBalancer()
{
//通过“双检锁”模式支持多线程的应用
if (balancer == null)
{
//只有一个县城可以取得mutex
Mutex mutex = new Mutex();
mutex.WaitOne();
if (balancer == null)
balancer = new LoadBalancer();
mutex.Close();
}
return balancer;
}
public string Server
{
get
{
int r = random.Next(servers.Count);
return servers[r].ToString();
}
}
}

//客户应用测试
class Client
{
[STAThread]
static void Main(string[] args)
{
LoadBalancer b1 = LoadBalancer.GetLoadBalancer();
LoadBalancer b2 = LoadBalancer.GetLoadBalancer();
LoadBalancer b3 = LoadBalancer.GetLoadBalancer();
LoadBalancer b4 = LoadBalancer.GetLoadBalancer();
//检查是否相同,是单一实例
if ((b1 == b2) && (b2 == b3) && (b3 == b4))
Console.WriteLine("Same instance");
//负载均衡
Console.WriteLine(b1.Server);
Console.WriteLine(b2.Server);
Console.WriteLine(b3.Server);
Console.WriteLine(b4.Server);
Console.Read();

}
}

  也可以在第一次调用getinstance方法就生成实例,直接了当。

  

代码

public class Singleton
{
private static readonly Singleton instance = new Singleton();
//注意默认的构造函数为私有,所以不能直接创建它
private Singleton() { }
//公共属性返回唯一实例
public static Singleton Instance
{
get { return instance; }
}
}

  • 优势和缺陷

  Singleton单例模式为一个面向对象的应用程序提供了对象唯一的访问点,不管它实现何种功能,此种模式都为设计及开发团队提供了共享的概念。然而,Singleton对象类派生子类就有很大的困难,只有在父类没有被实例化时才可以实现。值得注意的是,有些对象不可以做成Singleton,比如.net的数据库链接对象(Connection),整个应用程序同享一个Connection对象会出现连接池溢出错误。另外,.net提供了自动废物回收的技术,因此,如果实例化的对象长时间不被利用,系统会认为它是废物,自动消灭它并回收它的资源,下次利用时又会重新实例化,这种情况下应注意其状态的丢失。

  • 应用情景

  下面的情景很适合应用单例模式:

  1. 系统只需要一个实例的对象。

  2. 客户调用类的单个实例只允许使用一个公共访问点。

转载于:https://www.cnblogs.com/vrliym/archive/2010/10/26/1861978.html

八.创建型设计模式——Singleton Pattern(单例模式)相关推荐

  1. JAVA设计模式第二讲:创建型设计模式

    设计模式(design pattern)是对软件设计中普遍存在的各种问题,所提出的解决方案.本文以面试题作为切入点,介绍了设计模式的常见问题.我们需要掌握各种设计模式的原理.实现.设计意图和应用场景, ...

  2. 创建型设计模式(待更新)

    前言 - 熟能生巧(★★★) 关于设计模式的学习,需要结合具体的应用场景进行理解,即站在用户的角度去理解需求,目的是让自己设计的代码能够为用户提供统一的接口,并且设计的模块具有高内聚低耦合.有更好的可 ...

  3. 设计模式----创建型设计模式(单例模式、工厂方法模式、构建者模式)

    创建型设计模式 单例模式(Singleton Pattern) 单例模式介绍 代码演示 饿汉式(静态常量) 饿汉式(静态代码块) 懒汉式(线程不安全) 懒汉式(线程安全,同步方法) 懒汉式(线程安全, ...

  4. 创建型设计模式对比总结 设计模式(八)

    创建型模式是new 的一种替代方式,可以将对象的创建与具体的类型进行分离 目前已经介绍了5种创建型设计模式(如果简单工厂算一种的话,那就是6种) 分别是: 简单工厂模式.工厂方法模式.抽象工厂模式.建 ...

  5. 技术图文:02 创建型设计模式(下)

    创建型设计模式(下) 知识结构: 图1 知识结构 单例模式 – 确保对象的唯一性 Sunny 软件公司承接了一个服务器负载均衡软件的开发工作,该软件运行在一台负载均衡服务器上,可以将并发访问和数据流量 ...

  6. 从框架源码中学习创建型设计模式

    文章目录 从框架源码中解读创建型设计模式 工厂模式 案例一:RocketMQ源码-创建Producer生产者 案例二:RocketMQ源码-创建过滤器工厂 抽象工厂 案例一:Dubbo源码-创建缓存的 ...

  7. 设计模式--创建型设计模式

    一. 设计模式的目的 ​ 编写软件过程中,可能面临来自耦合性.内聚性.可维护性.可扩展性.重用性.灵活性等多方面的挑战,设计模式是为了让程序具有更好的: 代码重用性(即相同的代码,不用多次编写) 可读 ...

  8. java面向对象程序设计第三版_JAVA面向对象程序设计之创建型设计模式

    [本文详细介绍了JAVA面向对象程序设计中的创建型设计模式,欢迎读者朋友们阅读.转发和收藏!] 1 基本概念 1.1 什么是设计模式 设计模式( Design pattern )是一套被反复使用.多数 ...

  9. Java设计模式(二)创建型设计模式

    文章目录 三 创建型设计模式 3.1 单例设计模式 3.1.1 饿汉式(线程安全) 3.1.2 懒汉式(线程不安全) 3.1.3 优缺点 3.1.4 补充 3.1.5 框架中的使用 3.1.4.1 S ...

最新文章

  1. c#技巧教程(连载)
  2. Nature 子刊:加州大学Banfield组揭示CPR细菌和DPANN古菌多样性及与低温TEM下宿主互作关系...
  3. 题目1030:毕业bg
  4. 【转】测试思考——测试人员需要具备哪些素质?
  5. MATLAB中plot()画图的颜色线型和希腊字母参数设置
  6. Android:Activity(页面)的生存周期
  7. zabbix3.0.4 部署之一 (简介)
  8. ffplay flv mp4 转_FFmpeg将mp4转成flv
  9. 开发辅助工具Kalman Studio2.0发布,内置基于T4的代码生成器
  10. 深度学习笔记(8) 实践层面(三)
  11. 自定义数据格式的矢量地图实现
  12. html5 websocket 手机,HTML5 WebSocket 示范
  13. 折线图_Line plot - 折线图
  14. jquery中的live()方法
  15. 苹果手机怎么无线投屏?苹果手机无线投屏到电脑
  16. 阿里云服务器和腾讯云服务器优缺点分析
  17. EMD(Exploiting Modification Direction)
  18. 未能解析主引用“Fiddler”,因为它是针对“.NETFramework,Version=v4.6.1”框架生成的。该框架版本高于当前目标框架“.NETFramework,Version=v4.5
  19. 服务异步通信RabbitMQ
  20. Windows校验文件完整性(MD5)

热门文章

  1. struts html:select 默认选中,Struts2自动选择下拉框的值
  2. 目标检测(二十)--Mask R-CNN
  3. 前景检测算法(十七)--基于光流算法
  4. clickhouse 物化视图_再谈clickHouse:微博基于 ClickHouse 监控百亿流量下的指标
  5. remote Incorrect username or password ( access token ):用户名或密码不正确(访问令牌)
  6. 如何在html创建js对象,在js中使用createElement创建HTML对象和元素
  7. 孪生再世代表数字几_能科股份:智能制造需求旺盛,中标多领域数字孪生项目
  8. Hive 存储格式入门
  9. c语言不使用加运算符做加法运算
  10. Windows核心编程_组件透明