设计模式01: Singleton 单例模式(创建型模式)
Singleton 单例模式(创建型模式)
动机(Motivation)
当进行软件开发是会有这样一种需求:在系统中只有存在一个实例才能确保它们的逻辑正确性、以及良好的效率。
这应该是类设计者的责任,而不是使用者的责任。
意图(Intent)
保证一个类仅有一个实例,并提供一个该实例的全局访问点。——《设计模式》GoF
单线程Singleton模型实现:
pulic class Singleton
{
private static Singleton instance;//如果客户不需要这个实例最好不要new一个实例,不要在这里new private Singleton(){}//如果不写的话,将会是public的构造器,public是可以随便new的 public static Singleton Instance
{
get
{
if(instance==null)
{
instance=new Singleton();
}
return instance;
}
}
}
调用:Singleton instance = Singleton.Instance;
单线程Singleton模式的几个要点:
Singleton模式总的实例构造器可以设置为protected以允许子类派生。
Single模式一般不要支持IColoneable接口,因为这可能导致多个对象实例,同样与Singleton模式的初衷违背。
Single模式只考虑到了对象创建的管理,没有考虑对象销毁的管理。就支持垃圾回收的平台和对象的开销来讲,我们没有必要对其销毁进行特殊的处理。
多线程Singleton模型实现:
class Singleton
{
private static volatile Singleton instance=null;//编译代码的时候编译器会对代码微调,为了禁止微调所以要加volatile
private static object lockHelper=new object();
private Singleton(){}
public sttic Singleton Instance
{
get
{
if(instance==null)
{
lock(lockHelper)
{
if(instance==null)
{
instance=new Singleton();
}
}
}
return instance;
}
}
}
.NET自带的单例实现:
class Singleton
{
public static readonly Singleton Instance = new Singleton();//内联初始化
private Singleton(){}
}
等同于:
class Singleton
{
public static readonly Singleton Instance;//Instance在被访问之前会先走静态构造器
static Singleton()//静态构造器,.net类型初始化机制可以保证只有一个线程执行。静态构造器不能传递参数,它是给系统来调用的。
{
Instance=new Singleton();
}
private Singleton(){}
}
弊端:
不支持参数化
以单线程Singleton模型实现为例,就可以支撑参数化:
pulic class Singleton
{
private static Singleton instance; private Singleton(int x,int y)
{
this.x=x;
this.y=y;
} public static Singleton GetInstance(int x,int y)
{
if(instance==null)
{
instance=new Singleton(x,y);
}
else
{
instance.x=x;
instance.y=y;
}
return instance;
} int x;
int y;
}
调用:
Singleton t1=Singleton.GetInstance(100,200);
Singleton t2=Singleton.GetInstance(200,300);
其实可以用设置属性的方法也可以这实现:
class Singleton
{
public static readonly Singleton Instance = new Singleton();//内联初始化
private Singleton(){} public int x
{
get{
return this.x;
}
set{
this.x=x;
}
}
public int y
{
get{
return this.y;
}
set{
this.y=y;
}
}
int x;
int y; /*也可以添加初始化函数(也可以带参数),来和构造器进行剥离
public void Init()
{
...
}
*/
}
Singleton模式扩展
将一个实例扩展到n个实例,例如对象池的实现。
将new构造器的调用转移到其他类中,例如多个类协同工作环境中,某个局部环境只需要拥有某个类的一个实例。
理解和扩展Singleton模式的核心是“如何控制用户使用new对一个类的实例构造器的任意调用”。
最近在看李建忠老师的 《C#面向对象设计模式纵横谈》,虽然是很多年前的视频,还是很受启发,就决定把笔记整理一遍。
设计模式01: Singleton 单例模式(创建型模式)的更多相关文章
- C#面向对象设计模式纵横谈——2.Singleton 单件(创建型模式)
一:模式分类 从目的来看: 创建型(Creational)模式:负责对象创建. 结构型(Structural)模式:处理类与对象间的组合. 行为型(Behavioral)模式:类与对象交互中的职责分配 ...
- 单例模式——创建型模式01
1. 名称 单例模式(Singleton Pattern):确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类.单例模式是一种对象创建型模式. 2. 问题 ...
- java架构之路-(设计模式)五种创建型模式之单例模式
设计模式自身一直不是很了解,但其实我们时刻都在使用这些设计模式的,java有23种设计模式和6大原则. 设计模式是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可 ...
- Java设计模式(4)——创建型模式之单例模式(Singleton)
一.概述 弥补一下之前没有给设计模式下的定义,先介绍一下设计模式(引用自百度百科): 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结. 使用设计 ...
- Sington单例模式(创建型模式)
一.使用Sington单例模式的动机(Motivation) 在软件系统中,经常有一些特殊的类,必须保证它们只有一个实例,才能保证它的逻辑正确性.以及良好的效率. 大多数类用的是常规的构造器,所以往往 ...
- 设计模式-单例模式(Singleton) (创建型模式)
//以下代码来源: 设计模式精解-GoF 23种设计模式解析附C++实现源码 //Singleton.h #pragma once #include<iostream> class Sin ...
- [C#]设计模式-单例模式-创建型模式
单例模式用于在整个软件系统当中保持唯一实例,在 C# 当中最能够体现此概念的就是静态类,静态类的生命周期是跟随整个程序,并且在整个程序中仅保有一个实例. 不过在这里我们不再详细阐述单例模式与静态类有什 ...
- Java设计模式(1)——创建型模式之简单工厂模式(Simple Factory)
设计模式系列参考: http://www.cnblogs.com/Coda/p/4279688.html 一.概述 工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高 ...
- Java设计模式(5)——创建型模式之建造者模式(Builder)
一.概述 概念 将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示.(与工厂类不同的是它用于创建复合对象) UML图 主要角色 抽象建造者(Builder)——规范建造方法与结果 ...
- Java设计模式(3)——创建型模式之抽象工厂模式(Abstract Factory)
一.概述 抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式.抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象. UML图: 其他的过多概念不再 ...
随机推荐
- 程序4-2 access函数实例
//http://blog.chinaunix.net/uid-24549279-id-71355.html /* ========================================== ...
- Ubuntu14.04安装Matlab2014a
尝试在Ubuntu14.04下安装matlab2014a已经有两天了,即便是照着csdn上的步骤进行安装依然出现了不少问题,究其原因是对linux下的命令不理解,下面就自己摸索结合博客内容总结一下安装 ...
- 【转】CentOs中Apache开启rewrite模块详解
rewrite是apache环境的一个伪静态功能了,如果我们没有没让Apache开启rewrite功能,网站上所有的rewrite规则都不可使用. centos的配置文件放在: /etc/httpd/ ...
- Linux Shell 1>/dev/null 2>&1 含义
shell中可能经常能看到:echo log > /dev/null 2>&1 命令的结果可以通过%>的形式来定义输出 /dev/null :代表空设备文件> :代表 ...
- webservice有关application/xop+xml的异常
今天同事调用一个webservice时返回类似错误 响应消息的内容类型 multipart/related; type="application/xop+xml"; boundar ...
- java代码关于匿名内部类和接口的方法使用
总结:主要是多个按钮实现监听时,能够响应不同的事件 以上步骤我们可以用多种方法实现.但人们通常用二种方法.第一种方法是只利用一个监听器以及多个if语句来决定是哪个组件产生的事件:第二种方法是使用多个内 ...
- 数据分析与处理之二(Leveldb 实现原理)
郑重声明:本篇博客是自己学习 Leveldb 实现原理时参考了郎格科技系列博客整理的,原文地址:http://www.samecity.com/blog/Index.asp?SortID=12,只是为 ...
- WEB扫描器Atscan的安装和使用
项目地址:https://github.com/AlisamTechnology/ATSCAN root@sch01ar:/sch01ar# git clone https://github.com/ ...
- Hadoop Serialization -- hadoop序列化详解 (3)【ObjectWritable,集合Writable以及自定义的Writable】
前瞻:本文介绍ObjectWritable,集合Writable以及自定义的Writable TextPair 回顾: 前面了解到hadoop本身支持java的基本类型的序列化,并且提供相应的包装实现 ...
- Nginx Rewrite研究笔记
原文出自:http://blog.cafeneko.info/2010/10/nginx_rewrite_note/ 在新主机的迁移过程中,最大的困难就是WP permalink rewrite的设置 ...