一、概述

  弥补一下之前没有给设计模式下的定义,先介绍一下设计模式(引用自百度百科)

  

设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。
使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。

  设计模式概念的介绍,参见http://blog.jobbole.com/101076/

  其中涉及的设计原则的概念,参见随笔:http://www.cnblogs.com/jiangbei/p/6910790.html

二、单例模式

  单例模式:保证整个应用程序中某个类的实例有且只有一个(日志对象等)

  常见的单例分为两种——饿汉式懒汉式

  1.饿汉式

  通过静态属性:

  创建Sinleton类,此类实例只能唯一 

public class Singleton {
// 1.构造器私有化,保证不能通过外部创建实例
private Singleton() { }
// 2.自己内部创建唯一实例
static Singleton instance = new Singleton();
}

  因为是静态成员,所以可以通过类.的形式访问:

public class Demo01 {
public static void main(String[] args) {
// 静态方法创建两个对象
Singleton s1 = Singleton.instance;
Singleton s2 = Singleton.instance;
if (s1 == s2) {
System.out.println("s1、s2是同一个实例!");
} else {
System.out.println("s1、s2不是同一个实例!");
}
}
}

  

  通过静态方法:

  考虑到我们Java中非常重要的封装的概念,我们有必要对上述代码进行改进,让属性私有化,使得外部无法直接访问:

  新的Singleton类:

public class Singleton {
// 1.构造器私有化,保证不能通过外部创建实例
private Singleton() { }
// 2.创建私有唯一实例
private static Singleton instance = new Singleton();
// 3.对外创建公共的静态方法获取实例
public static Singleton getInstance() {
return instance;
}
}

  测试类:

 public static void main(String[] args) {
// 静态方法创建两个对象
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
if (s1 == s2) {
System.out.println("s1、s2是同一个实例!");
} else {
System.out.println("s1、s2不是同一个实例!");
}
}

  

  以上就是饿汉式的单例模式,正如其名,饿汉饿汉,饿了就要吃饭,所以它早早的(静态,类加载的时候)就创建好了实例

  创建完实例后以后不再改变,所以天生是线程安全的。

  2.懒汉式

  单例类Singleton2:

public class Singleton2 {
// 1.构造器私有化,不允许外部直接创建
private Singleton2() { }
// 2.声明静态属性(而不实例化)
private static Singleton2 instance;
// 3.对外提供静态获取方法
public static Singleton2 getInstance() {
if (instance == null) {
instance = new Singleton2();
}
return instance;
}
}

  测试类:

  public static void main(String[] args) {
// 静态方法创建两个对象
Singleton2 s1 = Singleton2.getInstance();
Singleton2 s2 = Singleton2.getInstance();
if (s1 == s2) {
System.out.println("s1、s2是同一个实例!");
} else {
System.out.println("s1、s2不是同一个实例!");
}
}

  

  懒汉式,也是和它的命名一样,懒得创建对象,初始化时只声明,第一次访问时才创建

  当然,不得不指出,上述懒汉式是线程不安全的,多线程下是会存在创建多个实例的问题的,为此我们通过以下的改进方法来保证线程安全:

    1.在getInstance()方法上加上同步(返回值前加):

 public static synchronized Singleton2 getInstance() {
if (instance == null) {
instance = new Singleton2();
}
return instance;
}

    2.双重检查double checking

  补充;此种双重检查有待考察,实际中请使用饿汉式!

  public static Singleton2 getInstance() {
if (instance == null) {
synchronized (Singleton2.class) {
if (instance == null) {
instance = new Singleton2();
}
}
}
return instance;
}

  // 如果没有双重检查,少了任何一重,都会出现要么性能不高,要么创建多个实例

  想了解更过有关单例的内容,请参见:http://blog.csdn.net/jason0539/article/details/23297037/

  将单例模式中的静态变量(单例)推广到多个静态变量,工厂方法根据参数返回不同的变量,即引申为多例模式!这里不再展开多例模式,可以参阅《Java与模式》一书!

Java设计模式(4)——创建型模式之单例模式(Singleton)的更多相关文章

  1. Java设计模式_创建型模式_单例模式

    单例模式的实现: 定义一个类,在类中定义该类的静态变量,再定一个一个获取该类的静态变量的方法. UML图:

  2. Java设计模式之创建型模式

    创建型模式分为五类:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式 一.工厂方法模式:接口-实现类.工厂类

  3. Python版设计模式: 创建型模式:单例模式和工厂模式家族

    一. 单例模式(Singleton) 所谓单例模式,也就是说不管什么时候都要确保只有一个对象实例存在.很多情况下,整个系统中只需要存在一个对象,所有的信息都从这个对象获取,比如系统的配置对象,或者是线 ...

  4. java架构之路-(设计模式)五种创建型模式之单例模式

    设计模式自身一直不是很了解,但其实我们时刻都在使用这些设计模式的,java有23种设计模式和6大原则. 设计模式是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可 ...

  5. 设计模式(Java版)-创建型模式之简单工厂模式

    前言:这段时间在学习设计模式,本人也是小菜一枚(所以写的如果有错误的地方请大大们给予指出).这个东西也是我一直想学习的,从点点滴滴做起,记录下自己每天的领悟! 一.工厂模式的动机 在软件系统中,经常面 ...

  6. GoF的23种设计模式之创建型模式的特点和分类

    创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是“将对象的创建与使用分离”.这样可以降低系统的耦合度,使用者不需要关注对象的创建细节,对象的创建由相关的工厂来完成.就像我们去商场购买商品时, ...

  7. Typescript玩转设计模式 之 创建型模式

    作者简介 joey 蚂蚁金服·数据体验技术团队 前言 我们团队的工作是用单页面应用的方式实现web工具.涉及到数万到十数万行的前端代码的管理,而且项目周期长达数年. 怎么样很好地管理好这种量级的前端代 ...

  8. Java 设计模式泛谈&装饰者模式和单例模式

    设计模式(Design Pattern) 1.是一套被反复使用.多人知晓的,经过分类编目 的 代码设计经验总结.使用设计模式是为了可重用代码,让代码更容易维护以及扩展. 2.简单的讲:所谓模式就是得到 ...

  9. 设计模式01 创建型模式 - 单例模式(Singleton Pattern)

    参考 [1] 设计模式之:创建型设计模式(6种) | 博客园 [2] 单例模式的八种写法比较 | 博客园 单例模式(Singleton  Pattern) 确保一个类有且仅有一个实例,并且为客户提供一 ...

  10. Java设计模式之职责型模式总结

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6548127.html 所谓职责型模式,就是采用各种模式来分配各个类的职责. 职责型模式包括 ...

随机推荐

  1. 如何在 MSBuild Target(Exec)中报告编译错误和编译警告

    编译错误和编译警告 MSBuild 的 Exec 自带有错误和警告的标准格式,按照此格式输出,将被识别为编译错误和编译警告. 而格式只是简简单单的 error: 开头或者 warning: 开头.冒号 ...

  2. June 27th 2017 Week 26th Tuesday

    Happiness takes no account of time. 幸福不觉光阴过. At the beginning of this week, I planned to make some s ...

  3. java学习第一步,使用IntelliJ IDEA编写自己的第一个java程序

    首先下载java的jdk,然后说一下IDEA的配置 IntelliJ IDEA目前公认的最好的java开发工具,不过一般的学校的教学还是使用eclipse来进行java的开发.所以老师一般只会教你如何 ...

  4. D3——根据数据画图

    为DOM元素添加class .attr("class", "bar") //为元素添加class属性,<div class="bar" ...

  5. SSH2整合需要jar包解释

    hibernate3.jar, Hibernate的库,必须使用的jar包 antlr-2.7.6.jar, 语法分析生成器 语言转换工具,hibernate利用它实现HQL到SQL的转换 cglib ...

  6. Android进阶笔记14:3种JSON解析工具(org.json、fastjson、gson)

    一. 目前解析json有三种工具:org.json(Java常用的解析),fastjson(阿里巴巴工程师开发的),Gson(Google官网出的),其中解析速度最快的是Gson. 3种json工具下 ...

  7. Django objects.values

    values(*fields) 返回一个ValuesQuerySet —— QuerySet 的一个子类,迭代时返回字典而不是模型实例对象. 每个字典表示一个对象,键对应于模型对象的属性名称. 下面的 ...

  8. SMB linux&windows共享文件

    搭建就不多说了:https://www.xuebuyuan.com/3235974.html 在其中可以用cd(进入目录),ls(罗列文件和文件夹),get(下载文件),put(上载文件) 等命令进行 ...

  9. 「LG2664 树上游戏」

    题目 这真是一道神仙的一批的题目 定义\(s(i,j)\)表示从点\(i\)到点\(j\)经过的颜色数量 设 \[sum_i=\sum_{j=1}^ns(i,j)\] 求出所有的\(sum_i\) 考 ...

  10. Myeclipse 自带Tomcat启动8080端口占用

    在启动Myeclipse自带的Tomcat发现报错,显示8080端口被占用 第一步:window+r 组合键,调出命令窗口. 第二步:输出命令:netstat -ano|findstr 8080   ...