就像上一节当中我们讲到的数组工具集一样,如果我们把他看作一个类,来应用,不阻止他new函数的话,这个类我们在整个过程当中我们只是用他来当一个工具。假如每次用都要new一下产生一个新对象的话,就会显得整体很浪费内存,那么能不能让这个对象在整个过程当中只产生一个实例供我们来使用呢,因为只要整个过程一个实例就够用了。

有,那就是单例设计模式。

在说单例设计模式之前,我们来看一下什么是设计模式。所谓的设计模式,就是前人在解决生活中常见问题时,抽象出来的一些思考的方法,这种思考的方法能够加快我们软件的构建速度。设计模式始源于建筑行业,我们都知道建筑行业,在建筑一个物体的时候,不可能重复的拆了盖,盖了拆。这样很费时间还有人力和物力。此时就有人再想,把成功的例子抽象出来,在建筑某一个建筑物的时候,直接利用这些成功并且有效率的方法,这样既能够保证工程顺利完成,也加快了建筑的速度,更为以后增加了复用性。同样在我们IT行业当中,也有人想到了这些方法,来解决我们软件当中最经常遇到的问题,并且抽象之为设计模式,《设计模式》这本书总共讲了23种设计模式,然而设计模式是一种思想,并且不局限于语言,比如java语言有设计模式,c、c++依然有自己的设计模式,这里强调的是一种思想,对不同的软件工程方面的问题,采取相同的思考方法,提高我们软件的开发速度还有提高代码的复用性,就尤为重要。

我们现在要讲到的单例模式就是其中的一种,那么单例模式适合解决哪些问题呢?

单例模式:保证一个类仅有一个实例,并提供访问他的全局方法节点。

思路:如果我们想让一类仅有一个实例,那么首先我们要确定他到底是否能够被new,或者被new几次。如果现在我们有一个类,我们想要让他存在一个实例的话,我们这个样子来写:

class Single
{ String name; Single(String name)
{ this.name = name; } public void say()
{ System.out.print("Hello World!"); } }

如果我们这个样子来写的话,我们可以像下面这样调用这个类,并且实例化他:

class SingleDemo
{ public static void main(String[] args) { Single s1 = new Single("Single One");
Single s2 = new Single("Single Two");
s1.say();
s2.say(); } }

很显然此时我们得到的不只是一个实例,我们得到了两个实例。那么怎么阻止其创建实例呢,这个时候我们第一个想到的就是私有化构造方法,私有化之后只能类内部的可以访问。类外部的是没法访问的。那么私有化之后又产生了另外一个问题,就是私有化了,我们外部就没办法访问到了,那么这个类此时就没有存在的意义了,怎么办呢。我们可以像先前保护成员变量那样,提供一个对外访问的方法,就提供了封装功能。那么此时还有一个问题就是,如果我们想要调用这个对外的方法,我们必须要先创建实例才可以,但是我们的类是禁止外部直接实例化的,此时我们就需要在类不需要的情况下来调用这个功能,这个时候我们就会想到static方法,因为static是先于构造而存在的,所以我们给方法加上static修饰,如果静态方法当中有变量的话,也必须是静态的,所以此时我们也要赋予成员变量name是静态的,除此之外,如果此时我们这样调用的话,仍然是可以产生多个对象,因为每次返回的对象都可以不同,所以我们想让这个保存对象的变量被static修饰,这样就保证了始终有一个实例在内存当中。

我们改写上面的为这样:

class Single
{ String name; private static Single s = new Single("Hello world1"); private Single(String name)
{
this.name = name;
} public static Single getInstance()
{ return s; } public void say()
{ System.out.print(this.name); } public void setName(String name)
{ this.name = name; } public String getName()
{ return name;
} } class SingleDemo
{ public static void main(String[] args) { Single s1 = Single.getInstance();
s1.say();
s1.setName("wocao");
Single s2 = Single.getInstance();
s2.say();
System.out.print(equal(s1,s2));
} public static Boolean equal(Single s1,Single s2)
{ return (s1 == s2); } }

单例设计模式也分为两种分别是:饿汉式和懒汉式,以上这种就属于饿汉式,一上来就创建对象然后返回。

懒汉式是先判断对象是否存在,如果存在就直接返回对象,否则就创建一个新的对象:

懒汉式:

class Single2
{ String name; private static Single2 s ; private Single2(String name)
{
this.name = name;
} public static Single getInstance()
{
if(s == null)
return s = new Single("Hello world1");
else
return s; } public void say()
{ System.out.print(this.name); } public void setName(String name)
{ this.name = name; } public String getName()
{ return name;
} }

懒汉式的特点就在于,如果要返回对象,我要先判断这个对象是否存在如果存在的话,我就不创建了,如果不存在我再创建。

单例模式内存图:待续.....

java学习面向对象之设计模式之单例模式的更多相关文章

  1. Java学习---面向对象的远程方法调用[RMI]

    基础知识 分布式计算是一门计算机科学,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给许多计算机进行处理,最后把这些计算结果综合起来得到最终的结果. 常见的分 ...

  2. java学习面向对象之异常之一

    一.异常的概述: 什么是异常?在我们编写java程序的时候,会出现一些问题,比如内存溢出啊或者数组索引超出最大索引啊,这些编程当中出现的这些个问题就是异常.但是异常也分为可以处理的和不可以处理的.比如 ...

  3. 大型Java进阶专题(五) 设计模式之单例模式与原型模式

    前言 ​ 今天开始我们专题的第四课了,最近公司项目忙,没时间写,今天抽空继续.上篇文章对工厂模式进行了详细的讲解,想必大家对设计模式合理运用的好处深有感触.本章节将介绍:单例模式与原型模式.本章节参考 ...

  4. php部分---面向对象,设计模式(单例模式、工厂模式)、oop六大原则;

    一.单例模式目的:为了控制对象的数量(只能够有一个,相当于类的计划生育)做法1.将类的构造函数做成私有的2.在类里面做了一个公有的函数来造对象3.将该函数变为静态的4.在函数里面加控制 class R ...

  5. java学习面向对象之匿名内部类

    之前我们提到“匿名”这个字眼的时候,是在学习new对象的时候,创建匿名对象的时候用到的,之所以说是匿名,是因为直接创建对象,而没有把这个对象赋值给某个值,才称之为匿名. 匿名对象回顾: class N ...

  6. java学习面向对象之内部类

    什么是面向对象内部类呢?所谓的内部类,即从字面意义上来理解的话,就是把类放到类当中. 那么内部类都有什么特点呢? 1.内部类可以访问包裹他的类的成员. 2.如果包裹他的类想访问被其包裹的类的话就得实例 ...

  7. java学习面向对象之多态

    如何理解多态,让我们举个例子来描述一下,因为单纯的说多态大家可能不理解: abstract class Animal { ; abstract void eat(); public void run( ...

  8. java学习面向对象之接口

    上一节当中我们说道抽象类,抽象类当中的方法可以是抽象的也可以是非抽象的,那么当抽象类中所有方法都是抽象的时候,我们就可以把它重新定义为接口.代码示例: abstract class Animal { ...

  9. java学习面向对象之父子构造函数初始化

    在之前讲到java面向对象继承的时候,我们只讲到了两个比较重要的知识点,一个是父子类当中有同名的成员变量,这个时候,我们引入了super这个关键字来区分这两个同名成员变量,除此之外,我们还讲到了父子同 ...

随机推荐

  1. python模拟登陆之下载

    好长时间没有更新博客了,哈哈. 今天公司给了这么一个需求,现在我们需要去淘宝获取上一天的订单号,然后再根据订单号去另一个接口去获取订单详情,然后再给我展示到web! 中间涉及到的技术点有: 模拟登陆 ...

  2. JMX 与系统管理--转

    前言 在 Java 程序的运行过程中,对 JVM 和系统的监测一直是 Java 开发人员在开发过程所需要的.一直以来,Java 开发人员必须通过一些底层的 JVM API,比如 JVMPI 和 JVM ...

  3. 亲测PHpnow 安装环境

    出现问题1: "C:\Windows\system32\7z.exe"' 不是 或批处理文件. 找不到 C:\Windows\system32\7z.exe------------ ...

  4. iOS 复杂动画之抽丝剥茧

    一.前言 随着开发者的增多和时间的累积,AppStore已经有非常多的应用了,每年都有很多新的APP产生.但是我们手机上留存的应用有限,所以如何吸引用户,成为产品设计的一项重要内容.其中炫酷的动画效果 ...

  5. Elasticsearch .Net Client NEST 多条件查询示例

    Elasticsearch .Net Client NEST 多条件查询示例 /// <summary> /// 多条件搜索例子 /// </summary> public c ...

  6. Objective-C:KVO

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css); @import url(/ ...

  7. 如果 @s int 把它转成字符,可以这样 cast(@s as varchar)

    如果 @s int 把它转成字符,可以这样 cast(@s as varchar)

  8. 在ASP中调用DLL的方法

    .net的dll已经不是严格意义上的动态连接库了,而是一个类或者类库.它是不能直接在ASP.VB等其它的应用环境中使用的.   我们可以通过COM包装器(COM callable wrapper (C ...

  9. sp_addlinkedserver的一些操作

    sp_addlinkedserver 创建一个链接的服务器,使其允许对分布式的.针对 OLE DB 数据源的异类查询进行访问.在使用 sp_addlinkedserver 创建链接的服务器之后,此服务 ...

  10. [笔记]dynamic gamma correction

    2014-03-17  14:37:04 周一 在设计过程中参考论文<一种改进的视频画质增强算法及VLSI设计>电子学报 在YUV色彩空间对输入图像的信息进行判断分类和对比度调整,然后对调 ...