八.创建型设计模式——Singleton Pattern(单例模式)
- 定义
单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类,它提供全局访问的方法。单例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行想整个系统提供这个实例。
UML类图如下:
类和对象之间的关系为:
1.Singleton(单例):提供了一个instance的方法,让客户可以使用它的唯一实例。内部实现只生成一个实例。
典型应用的顺序图如下:
实例1——负载均衡控制器
负载均衡器的实现就是单一的实例,对服务器的所以请求都通过一个了解服务器的状态对象来控制,因为个别的服务器可能会动态地开关。这个单例的类图如下:
{
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方法就生成实例,直接了当。
{
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(单例模式)相关推荐
- JAVA设计模式第二讲:创建型设计模式
设计模式(design pattern)是对软件设计中普遍存在的各种问题,所提出的解决方案.本文以面试题作为切入点,介绍了设计模式的常见问题.我们需要掌握各种设计模式的原理.实现.设计意图和应用场景, ...
- 创建型设计模式(待更新)
前言 - 熟能生巧(★★★) 关于设计模式的学习,需要结合具体的应用场景进行理解,即站在用户的角度去理解需求,目的是让自己设计的代码能够为用户提供统一的接口,并且设计的模块具有高内聚低耦合.有更好的可 ...
- 设计模式----创建型设计模式(单例模式、工厂方法模式、构建者模式)
创建型设计模式 单例模式(Singleton Pattern) 单例模式介绍 代码演示 饿汉式(静态常量) 饿汉式(静态代码块) 懒汉式(线程不安全) 懒汉式(线程安全,同步方法) 懒汉式(线程安全, ...
- 创建型设计模式对比总结 设计模式(八)
创建型模式是new 的一种替代方式,可以将对象的创建与具体的类型进行分离 目前已经介绍了5种创建型设计模式(如果简单工厂算一种的话,那就是6种) 分别是: 简单工厂模式.工厂方法模式.抽象工厂模式.建 ...
- 技术图文:02 创建型设计模式(下)
创建型设计模式(下) 知识结构: 图1 知识结构 单例模式 – 确保对象的唯一性 Sunny 软件公司承接了一个服务器负载均衡软件的开发工作,该软件运行在一台负载均衡服务器上,可以将并发访问和数据流量 ...
- 从框架源码中学习创建型设计模式
文章目录 从框架源码中解读创建型设计模式 工厂模式 案例一:RocketMQ源码-创建Producer生产者 案例二:RocketMQ源码-创建过滤器工厂 抽象工厂 案例一:Dubbo源码-创建缓存的 ...
- 设计模式--创建型设计模式
一. 设计模式的目的 编写软件过程中,可能面临来自耦合性.内聚性.可维护性.可扩展性.重用性.灵活性等多方面的挑战,设计模式是为了让程序具有更好的: 代码重用性(即相同的代码,不用多次编写) 可读 ...
- java面向对象程序设计第三版_JAVA面向对象程序设计之创建型设计模式
[本文详细介绍了JAVA面向对象程序设计中的创建型设计模式,欢迎读者朋友们阅读.转发和收藏!] 1 基本概念 1.1 什么是设计模式 设计模式( Design pattern )是一套被反复使用.多数 ...
- Java设计模式(二)创建型设计模式
文章目录 三 创建型设计模式 3.1 单例设计模式 3.1.1 饿汉式(线程安全) 3.1.2 懒汉式(线程不安全) 3.1.3 优缺点 3.1.4 补充 3.1.5 框架中的使用 3.1.4.1 S ...
最新文章
- c#技巧教程(连载)
- Nature 子刊:加州大学Banfield组揭示CPR细菌和DPANN古菌多样性及与低温TEM下宿主互作关系...
- 题目1030:毕业bg
- 【转】测试思考——测试人员需要具备哪些素质?
- MATLAB中plot()画图的颜色线型和希腊字母参数设置
- Android:Activity(页面)的生存周期
- zabbix3.0.4 部署之一 (简介)
- ffplay flv mp4 转_FFmpeg将mp4转成flv
- 开发辅助工具Kalman Studio2.0发布,内置基于T4的代码生成器
- 深度学习笔记(8) 实践层面(三)
- 自定义数据格式的矢量地图实现
- html5 websocket 手机,HTML5 WebSocket 示范
- 折线图_Line plot - 折线图
- jquery中的live()方法
- 苹果手机怎么无线投屏?苹果手机无线投屏到电脑
- 阿里云服务器和腾讯云服务器优缺点分析
- EMD(Exploiting Modification Direction)
- 未能解析主引用“Fiddler”,因为它是针对“.NETFramework,Version=v4.6.1”框架生成的。该框架版本高于当前目标框架“.NETFramework,Version=v4.5
- 服务异步通信RabbitMQ
- Windows校验文件完整性(MD5)
热门文章
- struts html:select 默认选中,Struts2自动选择下拉框的值
- 目标检测(二十)--Mask R-CNN
- 前景检测算法(十七)--基于光流算法
- clickhouse 物化视图_再谈clickHouse:微博基于 ClickHouse 监控百亿流量下的指标
- remote Incorrect username or password ( access token ):用户名或密码不正确(访问令牌)
- 如何在html创建js对象,在js中使用createElement创建HTML对象和元素
- 孪生再世代表数字几_能科股份:智能制造需求旺盛,中标多领域数字孪生项目
- Hive 存储格式入门
- c语言不使用加运算符做加法运算
- Windows核心编程_组件透明