1.7 单例模式初步

好书推荐:java与模式

1.7.1 什么是设计模式

设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。设计模式就像是经典的棋谱,不同的棋局,我们用不同的棋谱,免去我们自己再思考和摸索。设计模式是可以重复利用的解决方案,设计模式的提出是在1995 人,是由4 为作者提出的,称为GoF,也就是“四人组”。共23种设计模式。

1.7.2 单例(Singleton)设计模式

所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。如果我们要让类在一个虚拟机中只能产生一个对象,我们首先必须将类的构造方法的访问权限设置为private,这样,就不能用new操作符在类的外部产生类的对象了,但在类内部仍可以产生该类的对象。因为在类的外部开始还无法得到类的对象,只能调用该类的某个静态方法以返回类内部创建的对象,静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该类对象的变量也必须定义成静态的。

设计模式从结构上分为三类:创建型、结构性、行为型。

其中最简单的设计模式就是单例了,单例这种模式,尽量少用,也有将其称为“反模式”,缺点是单例模式的类型无法被继承。

单例模式有什么好处

我们知道对象实例创建完成后,会放到堆中,如果堆中的实例过多,将会存在特别多的

垃圾,这样会导致一些问题,如内存溢出等,使用单例模式后,只会创建一个实例,显著减

少对象实例的个数,同时也会提高性能,因为不会频繁的创建对象,这只是他的一个好处,

其他方面项目中再说。总之,为了保证JVM中某一个类型的java对象永远只有一个,为了节省内存的开销。

单例模式的三要素

>在类体中需要具有静态的私有的本类型的变量

>构造方法必须是私有的

>提供一个公共的静态的入口点方法

实现单例模式的两种方式

饿汉式单例:在类加载阶段就创建了对象。

懒汉式单例:用到对象的时候才会创建对象。

public class Singleton{ //懒汉式单例

//静态变量

private static Singleton s;

//将构造方法私有化

private Singleton(){}

//对外提供一个公开获取Singleton对象的方法.

public static Singleton getInstance(){

if(s==null){ //可能存在线程安全问题的!

s = new Singleton();

}

return s;

}

}

public class Customer{ //饿汉式单例模式

//类加载时只执行一次。

private static Customer c = new Customer();

//构造方法私有化

private Customer(){}

//提供公开的方法

public static Customer getInstance(){

return c;

}

}

public class Test01{//测试

public static void main(String[] arg){

/*

Singleton s1 = new Singleton();

Singleton s2 = new Singleton();

System.out.println(s1==s2);

*/

Singleton s1 = Singleton.getInstance();

Singleton s2 = Singleton.getInstance();

Singleton s3 = Singleton.getInstance();

System.out.println(s1==s2);

System.out.println(s2==s3);

}

}

其他饿汉式举例

//饿汉式1

class Bank{

//1.私有化构造器

private Bank(){}

//2.创建类的对象,同时设置为private的,通过公共的来调用,体现封装性

//4.要求此对象也为static的

private static Bank instance = new Bank();

//3.此公共的方法,必须为static

public static Bank getInstance(){

return instance;

}

}

//饿汉式2

class Bank{

//1.私有化构造器

private Bank(){}

//2.创建类的对象,同时设置为private的,通过公共的来调用,体现封装性

//4.要求此对象也为static的

private static Bank instance = null;

static{

instance  = new Bank();

}

//3.此公共的方法,必须为static

public static Bank getInstance(){

return instance;

}

}

Java——单例模式初步的更多相关文章

  1. 用java单例模式实现面板切换

    1.首先介绍一下什么是单例模式: java单例模式是一种常见的设计模式,那么我们先看看懒汉模式: public class Singleton_ { //设为私有方法,防止被外部类引用或实例 priv ...

  2. 【深入】java 单例模式(转)

    [深入]java 单例模式 关于单例模式的文章,其实网上早就已经泛滥了.但一个小小的单例,里面却是有着许多的变化.网上的文章大多也是提到了其中的一个或几个点,很少有比较全面且脉络清晰的文章,于是,我便 ...

  3. 深入Java单例模式(转)

    深入Java单例模式 源自 http://devbean.blog.51cto.com/448512/203501 在GoF的23种设计模式中,单例模式是比较简单的一种.然而,有时候越是简单的东西越容 ...

  4. Java 单例模式的七种写法

    Java 单例模式的七种写法 第一种(懒汉,线程不安全) public class Singleton { private static Singleton instance; private Sin ...

  5. java单例模式之懒汉式分析

    转自:http://blog.csdn.net/withiter/article/details/8140338 今天中午闲着没事,就随便写点关于Java单例模式的.其实单例模式实现有很多方法,这里我 ...

  6. Java反射-初步入门

    Java反射-初步入门 学反射先了解什么是反射. 百度百科:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动 ...

  7. Java 单例模式探讨

    以下是我再次研究单例(Java 单例模式缺点)时在网上收集的资料,相信你们看完就对单例完全掌握了 Java单例模式应该是看起来以及用起来简单的一种设计模式,但是就实现方式以及原理来说,也并不浅显哦. ...

  8. 单例模式:Java单例模式的几种写法及它们的优缺点

    总结下Java单例模式的几种写法: 1. 饿汉式 public class Singleton { private static Singleton instance = new Singleton( ...

  9. 9种Java单例模式详解(推荐)

    单例模式的特点 一个类只允许产生一个实例化对象. 单例类构造方法私有化,不允许外部创建对象. 单例类向外提供静态方法,调用方法返回内部创建的实例化对象.  懒汉式(线程不安全) 其主要表现在单例类在外 ...

随机推荐

  1. python_django_admin

    admin 是Django提供的基于web的管理工具,是系统管理员用于数据的输入,删除和查询的管理工具. 超级管理员在settings中的集成:INSTALLED_APPS=['django.cont ...

  2. Form与ModelForm中的插件使用

    一.Form插件的使用 (一)widget参数 from .models import * from django import forms from django.forms import widg ...

  3. USACO18DEC Platinum

    standing out from the field 给你n个串,对于每个串求出只包含在这个串中的本质不同的子串? 后缀自动机,建树,对于每一个点打上包含在哪个串中的标记. 叶子都是前缀,直接在sa ...

  4. 一场comet常规赛的台前幕后

    有出题的想法大概是#8比完之后,#8的比赛较易,应该是符合https://info.cometoj.com 上的常规赛难度说明. 我们几个觉得我们一定可以出质量更高的题. 那个时候在玩线段树的时碰巧想 ...

  5. STM32嵌入式开发学习笔记(五):中断

    我们过去了解了用循环实现延时,或用系统滴答计时器实现延时,但这两种方法都有一种问题:会阻塞处理器的运行.下面我们学习一种不阻塞处理器运行其他事件的功能:时钟中断. 所谓中断,就是让处理器放下手头的事情 ...

  6. ACdream 1157 (cdq分治)

    题目链接 Segments Time Limit: 4000/2000MS (Java/Others)Memory Limit: 20000/10000KB (Java/Others) Problem ...

  7. Windows 安装 Anaconda3+PyCharm

    由于本人使用的是windows 10 操作系统,所以介绍在 windows 10 系统中安装 Anaconda3 的过程. 下载 Anaconda 官网下载地址:https://www.anacond ...

  8. unittest框架学习笔记三之testsuite

    # coding=utf-8 '''created :2018/3/29 author:star project: testsuite'''import unittest,time,osfrom ba ...

  9. Java-Class-@I:org.springframework.web.bind.annotation.PostMapping

    ylbtech-Java-Class-@I:org.springframework.web.bind.annotation.PostMapping 1.返回顶部   2.返回顶部 1. package ...

  10. PHP面试 PHP基础知识 二(常量及数据类型)

    常量及数据类型 PHP八种数据类型 四种标量类型 字符串(string).布尔(boolean).浮点(float/double).整型(integer) 两种复合类型 数组(array).对象(ob ...