设计模式之第0章-单例模式(Java实现)
设计模式之第0章-单例模式(Java实现)
当当当当~首先有请最简单的单例模式登场,先来个自我介绍吧
单例模式之自我介绍
我,单例模式(Singleton Pattern)是一个比较简单的模式,我的定义如下:
Ensure a class has only one instance,and provide a global point of access to it.(确保其某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。)单例模式的通用类图如下:

Singleton类称为单例类,通过使用private的构造函数确保了在一个应用中只产生一个实例,并且是自行实例化的。
单例模式之自我分析
做人,哦不,做模式不能自满,所以先谈谈我的缺点,我的缺点如下:
- 我一般没有接口,扩展很困难,如果想扩展的话,除了修改代码基本上没有第二种方式。当然了,特殊情况下,我也可以实现接口、被继承等,这个需要你们自行判断。
- 测试不便。在并行开发中,如果你们没有把我完成,那么是没有办法进行测试的。
- 还有一点,我与单一职责原则也有冲突,一个类本应实现一个逻辑,不该关心是否是单例的,是不是要单例取决于环境,但是我把单例和业务逻辑融合在一个类中了。
终于该说优点了~挺好了,比缺点可是要多的说:
- 对唯一实例的受控访问。由于我的类封装了我唯一的实例,所以可以严格控制用户以及何时访问它。
- 缩小名空间。我可以避免那些存储唯一实例的全局变量污染名空间。
- 允许对操作和表示的精化。
- 允许可变数目的实例。
- 比类操作更灵活。
单例模式之实现
俗话说,说的比唱的好听。为了证明我唱的也很好听,接下来我就以人类的一夫一妻制来具体讲解一下如何实现我的模式~一夫一妻制又称作”单偶婚“,“个体婚”,据说一夫一妻制起源于秦始皇统一天下之后,自大秦一统天下,中国酒实行了一夫一妻制,尤其是在汉朝“罢黜百家,独尊儒术”开始,古人严格执行了这一制度blablabla...(此处省略n字)。咳咳,跑题了,我们接着谈一夫一妻制,哦不,单例模式,首先得有个妻子类:
public class Wife{
private static final Wife wife = new Wife();
private Wife(){
}
public static Wife getInstance(){
return wife;
}
public static void say(){
System.out.println("I am Y's wife!");
}
}
通过定义一个私有访问权限的构造函数,可以避免被其他类new出来一个对象,而Wife自己可以new一个对象出来,其他的类对该类的访问可以通过getInstance获得一个对象。妻子有了,老公Y自然要出场了,其类代码如下:
public class Y{
public static void main(String[] args) {
for (int day=0; day<3;day++ ) {
Wife wife = Wife.getInstance();
wife.say();
}
}
}
运行结果如下:
I am Y's wife!
I am Y's wife!
I am Y's wife!
Y每天回家见到的妻子,都是同一个妻子,不会出现开门后,一看,呦呵,老婆怎么变了?如有此情况,请速与我联系!
单例模式之优化OR问题
有人嫌这样麻烦,因为无论是都使用这个类,都会创建一个instance对象,如果创建这个很耗时,比如需要连接10**9(python的10的9次方写法)次数据库,并且还不一定使用,那该这么办?于是乎有“聪明人”想到如下的方法:
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
是不是感觉很不错,很好?这个是传说中的懒汉模式其实这个有个很大的问题,如果是高并发情况下,可能A线程在创建实例,但是还没获取对象,B此时也在执行,判断也为真,所以又获得一个对象,如此下去,你的妻子会越来越多!没办法了么?不,当然有,且往下看:
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
这种写法确实解决了问题,但是效率么,啧啧,99%情况下不需要同步我会告诉你么?
奇技淫巧:单例模式之反射实现
public class Singleton{
private static Singleton singleton;
static{
try{
class cl = class.forName(Singleton.class.getName());
//获得无参构造
Constructor con = cl.getDeclaredConstructor();
//设置无参构造是可访问的
con.setAccessible(true);
//产生一个实例对象
singleton = (Singleton)con.newInstance();
}
catch(Exception e)
{
}
}
public static Singleton getSingleton(){
return singleton;
}
}
通过获得类构造,然后设置访问权限,生成一个对象,然后提供外部访问,保证内存对象单一。
以上就是我,单例模式,谢谢大家~下回就是我的大哥来做演讲了,欲知后事如何,且听下回分解。
PS:本博客欢迎转发,但请注明博客地址及作者~
博客地址:http://www.cnblogs.com/voidy/
博客新址:http://voidy.net
<。)#)))≦
设计模式之第0章-单例模式(Java实现)的更多相关文章
- 设计模式之第4章-装饰模式(Java实现)
设计模式之第4章-装饰模式(Java实现) “怎么了,鱼哥?” “唉,别提了,网购了一件衣服,结果发现和商家描述的差太多了,有色差就算了,质量还不好,质量不好就算了,竟然大小也不行,说好的3个X,邮的 ...
- 设计模式之第18章-观察者模式(Java实现)
设计模式之第18章-观察者模式(Java实现) 话说曾小贤,也就是陈赫这些天有些火,那么这些明星最怕的,同样最喜欢的是什么呢?没错,就是狗仔队.英文的名字比较有意思,是paparazzo,这一说法据说 ...
- 设计模式之第15章-适配器模式(Java实现)
设计模式之第15章-适配器模式(Java实现) “呔,来着何人,报上名来.”“这是谁啊,我怎么没见过”,“就是啊,我也没印象.”“我当然是适配器了,要不然还能是谁.”适配器模式碎碎念:我不就是昨天把你 ...
- 设计模式之第3章-模板方法模式(Java实现)
设计模式之第3章-模板方法模式(Java实现) "那个,上次由于我老婆要给我做饭,所以就没有说完就走掉了...这个那个".这次和以前一样,先来开场福利(工厂方法模式已被作者踹下场) ...
- 设计模式之第2章-抽象工厂模式(Java实现)
设计模式之第2章-抽象工厂模式(Java实现) “上次是我的不对,贿赂作者让我先讲来着,不过老婆大人大人有大量,不与我计较,这次还让我先把上次未讲完的应用场景部分给补充上去,有妻如此,夫复何求.”(说 ...
- 设计模式之第1章-工厂方法模式(Java实现)
设计模式之第1章-工厂方法模式(Java实现) “我先来”,“不,老公,我先!”.远远的就听到几个人,哦不,是工厂方法模式和抽象工厂模式俩小夫妻在争吵,尼妹,又不是吃东西,谁先来不都一样(吃货的世界~ ...
- Head First 设计模式 第5章 单例模式
第5章 单例模式 1.定义:确保一个类只有一个实例,并为其创建访问点. 2.单例模式的类图: 对应的单例模式的代码: package com.ek.singleton; /** * @包名 com.e ...
- 设计模式之第13章-职责链模式(Java实现)
设计模式之第13章-职责链模式(Java实现) “请假都那么麻烦,至于么.”“咋的了?”“这不快过年了么,所以我想早两天回去,准备一下,买买东西什么的,然后去给项目经理请假,但是他说快过年了,所以这个 ...
- 设计模式之第11章-建造者模式(Java实现)
设计模式之第11章-建造者模式(Java实现) “那个餐厅我也是醉了...”“怎么了?”“上菜顺序啊,竟然先上甜品,然后是冷饮,再然后才是菜什么的,无语死了.”“这个顺序也有人这么点的啊.不过很少就是 ...
随机推荐
- javaweb 工程 tomcat启动报错的问你
2015-03-03 14:39:32,657 INFO (org.springframework.web.context.ContextLoader:296) - Root WebApplicati ...
- centos7.3.1611安装及初始配置
安装前规划: 主机名称 网络配置 分区配置 分区配置 自定义分区,标准分区 /boot 200M (可选) swap 内存1.5倍到2倍(不大于8G) / 根分区(100G到200G) 其余的备用(数 ...
- Piwik-2.16.1 (OpenLogic CentOS7.2)
平台: CentOS 类型: 虚拟机镜像 软件包: centos7.2 piwik devops log analysis monitoring open-source 服务优惠价: 按服务商许可协议 ...
- 美国L1签证面谈的时候一般VO会问到什么问题?
L签证:L签证签发给被其中国公司调派到美国分公司或合资公司工作的人员.申请人必须将在美国担任经理级职务或具有专业知识,且在申请签证前的三年中至少为同一雇主或公司连续工作至少一年.签证签发费将因签证的入 ...
- 360、IE等浏览器对bootstrap的影响
笔者开发的web程序部署上线后发现,bootstrap的菜单不显示,开发时候用chrome没有发现问题,在360浏览器上跑,发现360默认的是兼容模式,切换到极速模式就能够显示菜单了. 但是这样的用户 ...
- pta 编程题6 树的同构
其它pta数据结构编程题请参见:pta 题目请参见:树的同构 因题目中左右子树是按照下标给出,因此用数组存放树是更好的方法. 判断两棵树是否同构:用递归的方法.如果当前两个结点都为空,则返回TRUE: ...
- vue登录权限
登录:当用户填写完账号和密码后向服务端验证是否正确,验证通过之后,服务端会返回一个token,拿到token之后(我会将这个token存贮到cookie中,保证刷新页面后能记住用户登录状态),前端会根 ...
- python3安装pip
wget --no-check-certificate https://pypi.python.org/packages/source/p/pip/pip-8.0.2.tar.gz#md5=3a73c ...
- 10个HTML5 实战教程 提升你的综合开发能力
HTML5 作为下一代网站开发技术,无论你是一个 Web 开发人员或者想探索新的平台的游戏开发者,都值得去研究.借助尖端功能,技术和 API,HTML5 允许你创建响应性.创新性.互动性以及令人惊叹的 ...
- dn.net/blueheart20/article/details/22080489
dn.net/blueheart20/article/details/22080489