最常用的设计模式(单例模式)

  记得刚开始涉足程序的时候, 去笔试 ,发现有一个笔试题经常粗线,写一个单例模式的基本实现, 当时没研究设计模式也就不知为何物,

  到今日  , 才发现它已成为我日常开发最常用的一种设计模式。

  我写的所有设计模式的代码都会用java 呈现, 虽然第一个学习的是c++但是 最开始作为工作的是java,并且有点偏好java

  单例模式 , 意思就是 整个系统仅只有此类的一个实力, 当然这只是狭义的单例,经常看到变种的单例是允许,创建指定数量的实例的

  单例模式是一种创建型模式。 它是优化的一种策划, 避免重复创建销毁一个对象(创建销毁对象是有开销的), 有点像对象池的概念。

  

  我写博文  纯粹是对自己所了解的东西的一个回顾,  不保证权威性。  仅希望 迷途的新手能在我的博文中
有所收获,我也尽量 用我最简单的语言 去描述 我对 很多东西的理解、(这段话会在我的每一个博文里面出现 因为 我不是一个看了书 做笔记的博客,
而是我进行思考的博客 ,当然也希望大牛可以批评指正)

  下面给出一个最简单的单例的实现


 1 public class HelloSingleton {
2
3 private static HelloSingleton w_Instance = new HelloSingleton();
4
5 //定义一个私有的构造函数,确保在该类的外部无法生成类的实例
6 private HelloSingleton(){
7
8 }
9
10 public static HelloSingleton getInst(){
11 return w_Instance;
12 }
13 }

这一种单例模式被成为饿汉模式, 其实意思就是开始的时候就实例好了 对象, 缺点是没有做到延迟加载
(延迟加载是一种优化策略,在需要的时候再去加载)这个用起来比较简便

然后下面是 另外一种单例模式,懒汉模式


public class HelloSingleton {

private static HelloSingleton w_Instance;

//定义一个私有的构造函数,确保在该类的外部无法生成类的实例
private HelloSingleton(){

}

public static HelloSingleton getInst(){
if(w_Instance == null){
w_Instance = new HelloSingleton();
}
return w_Instance;
}
}


public class HelloSingleton {

private static HelloSingleton w_Instance;

//定义一个私有的构造函数,确保在该类的外部无法生成类的实例
private HelloSingleton(){

}

public static HelloSingleton getInst(){
if(w_Instance == null){
w_Instance = new HelloSingleton();
}
return w_Instance;
}
}

网上看到,或者大多数人都是如此写懒汉模式的, 这种写法在单线程环境下是安全的, 但是在多线程环境下 会造成生成多个实例的问题

比如现成A正在访问 getInst()方法 ,线程A读到w_Instance 为null
,创建该类对象并返回,线程B正好在此时也访问getInst方法,此时现成A构造的实例现成B无法看见,因为多线程环境中非同步代码快无法保证共享变量的可见性。所以该写法是有问题的,
调整为如下则不会在多线程环境下出现创建多个实例的问题。


 1 public class HelloSingleton {
2
3 private static HelloSingleton w_Instance;
4
5 //定义一个私有的构造函数,确保在该类的外部无法生成类的实例
6 private HelloSingleton(){
7
8 }
9
10 public static synchronized HelloSingleton getInst(){
11 if(w_Instance == null){
12 w_Instance = new HelloSingleton();
13 }
14 return w_Instance;
15 }
16 }


 1 public class HelloSingleton {
2
3 private static HelloSingleton w_Instance;
4
5 //定义一个私有的构造函数,确保在该类的外部无法生成类的实例
6 private HelloSingleton(){
7
8 }
9
10 public static synchronized HelloSingleton getInst(){
11 if(w_Instance == null){
12 w_Instance = new HelloSingleton();
13 }
14 return w_Instance;
15 }
16 }

java用synchronized保证同步代码快。 同步代码快 既保证 变量的原子性,也保证变量的可见性。

上面是最简单的两种单例的写法,但是为了扩展 , 还是介绍一些 其他的 常见的单例的写法。

effective   java作者 推崇的 用枚举的方式实现的 singleton


1 public enum HelloSingleton {
2
3 Instance;
4
5 }

额 你没有看错 就是这个样子的  , 起初 看到这个代码 , 我也很疑惑 , 这个是单例吗, 但是确实它也实现了单例 模式。
java的枚举不同于 c++ , c#等语言, java的枚举是用对象实现的, 所以此枚举里 仅有一个对象

它的优点是这么介绍的 优点:不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象

第四种单例,采用静态内部类型, 我的同时  很多次 跟我讲 他觉得java的内部类真的是很扯淡的设计, 不知道是干什么用的,
但是我个人感觉java的内部类让java 语言用起来更灵活, 比如我 不想让别人使用的类 仅仅想在一个对象里面使用的类 ,就可以用private 定义一个
内部类 , 别人无须知道 内部实现。 更好的实现封装的思想,

代码示意图如下


 1 public class HelloSingleton {
2 private static class SingletonHolder
3 {
4 private final static HelloSingleton w_Instance = new HelloSingleton();
5 }
6
7 private HelloSingleton(){
8
9 }
10
11 public static HelloSingleton getInst(){
12 return SingletonHolder.w_Instance;
13 }
14 }

此类型看起来比较晦涩  好像绕了不烧 ,
这样写的好处是:加载时不会初始化静态变量INSTANCE,因为没有主动使用,达到延迟加载

还有一个类型就不介绍了 ,因为个人 基本没用到过,   感觉自己最常用的就是第二种, 懒汉式 , 单例。

设计模式, 单例, 就是这么简单 。

关于单例的变种你可以这么想 , 有的时候   你会想让单例 生成指定数量的 实例, 具体实现就是在 类里面加个 数量, 然后每次getInst
的时候去判断 是否达到最大数量, 如果达到就不在生成新的实例 ,如果没有,就生成新的实例返回, 好了 单例 就这么简单, 感觉没什么好说的 就写到这里

  

最常用的设计模式(单例模式),布布扣,bubuko.com

时间: 2024-11-25 14:38:23

最常用的设计模式(单例模式)的相关文章

IOS常用设计模式——单例模式(IOS开发)

IOS常用的设计模式包括:单例模式.委托模式.观察者模式和MVC模式. 这里主要讲单例模式 单例模式 -问题: 主要解决应用中只有一个实例的问题(只需要某个类的实例) -原理:一般会封装一个静态属性,并提供静态实例的创建方法 -应用:单例类 // Singleton.h @interface Singleton : NSObject + (Singleton *)sharedManager; @property (nonatomic, strong) NSString* stingletonDa

设计模式-单例模式(Go语言描述)

这篇博客我们继续来看设计模式,今天带来的是一个最简单而且最常用的模式-单例模式.那什么是单例模式呢?相信大家最它最熟悉不过了,那我们就来快速的了解一下它的定义. 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 这个解释足够简单.说白了就是假如我们希望我们在我们的系统中该类仅仅存在1个或0个该类的实例.虽然单例模式很简单,但是熟悉java的同学可能了解,单例模式有很多写法,懒汉式.饿汉式.双重锁... 这么多形式,难道有什么目的?确实,不过他们的目的很明确,就是保证在一种特殊情况下的单例-

iOS开发中常用的设计模式

常用的设计模式(一)代理模式应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现.优势:解耦合敏捷原则:开放-封闭原则实例:tableview的 数据源delegate,通过和protocol的配合,完成委托诉求.列表row个数delegate自定义的delegate (二)观察者模式应用场景:一般为model层对,controller和view进行的通知方式,不关心谁去接收,只负责发布信息.优势:解耦合敏捷原则:接口隔离原则,开放-封闭原则实例:Notificatio

(3)Java设计模式-单例模式

单例模式(Singleton)是一种较为常用的设计模式,单例对象能保证在JVM虚拟中,该对象只有一个实例存在. 1.(懒汉,线程不安全) 1 //单例模式 2 public class Singleton { 3 // 私有化构造方法防止对象在外部被实例化 4 private Singleton() { 5 System.out.println("create"); 6 } 7 8 // 私有化静态实例,防止实例被外部应用 9 private static Singleton sing

Java设计模式-单例模式(Singleton)

单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处: 1.某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销. 2.省去了new操作符,降低了系统内存的使用频率,减轻GC压力. 3.有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了.(比如一个军队出现了多个司令员同时指挥,肯定会乱成一团),所以只有使用单例模式,才能保证核心交易服务器独立控制整个流程. 单例

几种常用的设计模式介绍

几种常用的设计模式介绍                                         1.    设计模式的起源 最早提出“设计模式”概念的是建筑设计大师亚力山大Alexander.在1970年他的<建筑的永恒之道>里描述了投计模式的发现,因为它已经存在了千百年之久,而现代才被通过大量的研究而被发现. 在<建筑的永恒之道>里这样描述:模式是一条由三个部分组成的通用规则:它表示了一个特定环境.一类问题和一个解决方案之间的关系.每一个模式描述了一个不断重复发生的问题,

设计模式--单例模式之Lock

1.为什么用Lock及关键知识 当我们使用线程的时候,效率最高的方式当然是异步,即个个线程同时运行,其间互不依赖和等待.当不同的线程都需要访问某个资源的时候,就需要同步机制了,也就是说当对同一个资源进行读写的时候,我们要使该资源在同一时刻只能被同一个线程操作,以确保每个操作都是有效即时的,也即保证其操作的原子性.lock是C#中最常用的同步方式,格式为lock(objectA){codeB} . lock(objectA){codeB}表示意义: 1. objectA被lock了吗?没有则由我来

【动力节点java培训】J2ee常用的设计模式

[动力节点java培训]J2ee常用的设计模式 Java中的23种设计模式: Factory(工厂模式),      Builder(建造模式),      Factory Method(工厂方法模式), Prototype(原始模型模式),Singleton(单例模式),    Facade(门面模式), Adapter(适配器模式),    Bridge(桥梁模式),       Composite(合成模式), Decorator(装饰模式),    Flyweight(享元模式),   

iOS中常用的设计模式

常用的设计模式(一)代理模式应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现.优势:解耦合敏捷原则:开放-封闭原则实例:tableview的 数据源delegate,通过和protocol的配合,完成委托诉求.列表row个数delegate自定义的delegate (二)观察者模式应用场景:一般为model层对,controller和view进行的通知方式,不关心谁去接收,只负责发布信息.优势:解耦合敏捷原则:接口隔离原则,开放-封闭原则实例:Notificatio