java学习面向对象之设计模式之单例模式
就像上一节当中我们讲到的数组工具集一样,如果我们把他看作一个类,来应用,不阻止他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学习面向对象之设计模式之单例模式的更多相关文章
- Java学习---面向对象的远程方法调用[RMI]
		
基础知识 分布式计算是一门计算机科学,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给许多计算机进行处理,最后把这些计算结果综合起来得到最终的结果. 常见的分 ...
 - java学习面向对象之异常之一
		
一.异常的概述: 什么是异常?在我们编写java程序的时候,会出现一些问题,比如内存溢出啊或者数组索引超出最大索引啊,这些编程当中出现的这些个问题就是异常.但是异常也分为可以处理的和不可以处理的.比如 ...
 - 大型Java进阶专题(五) 设计模式之单例模式与原型模式
		
前言  今天开始我们专题的第四课了,最近公司项目忙,没时间写,今天抽空继续.上篇文章对工厂模式进行了详细的讲解,想必大家对设计模式合理运用的好处深有感触.本章节将介绍:单例模式与原型模式.本章节参考 ...
 - php部分---面向对象,设计模式(单例模式、工厂模式)、oop六大原则;
		
一.单例模式目的:为了控制对象的数量(只能够有一个,相当于类的计划生育)做法1.将类的构造函数做成私有的2.在类里面做了一个公有的函数来造对象3.将该函数变为静态的4.在函数里面加控制 class R ...
 - java学习面向对象之匿名内部类
		
之前我们提到“匿名”这个字眼的时候,是在学习new对象的时候,创建匿名对象的时候用到的,之所以说是匿名,是因为直接创建对象,而没有把这个对象赋值给某个值,才称之为匿名. 匿名对象回顾: class N ...
 - java学习面向对象之内部类
		
什么是面向对象内部类呢?所谓的内部类,即从字面意义上来理解的话,就是把类放到类当中. 那么内部类都有什么特点呢? 1.内部类可以访问包裹他的类的成员. 2.如果包裹他的类想访问被其包裹的类的话就得实例 ...
 - java学习面向对象之多态
		
如何理解多态,让我们举个例子来描述一下,因为单纯的说多态大家可能不理解: abstract class Animal { ; abstract void eat(); public void run( ...
 - java学习面向对象之接口
		
上一节当中我们说道抽象类,抽象类当中的方法可以是抽象的也可以是非抽象的,那么当抽象类中所有方法都是抽象的时候,我们就可以把它重新定义为接口.代码示例: abstract class Animal { ...
 - java学习面向对象之父子构造函数初始化
		
在之前讲到java面向对象继承的时候,我们只讲到了两个比较重要的知识点,一个是父子类当中有同名的成员变量,这个时候,我们引入了super这个关键字来区分这两个同名成员变量,除此之外,我们还讲到了父子同 ...
 
随机推荐
- 粗谈pcap_next_ex()
			
pcap_next_ex(pcap_t* p,struct pcap_pkthdr** pkt_header,const u_char** pkt_data) 功能: 从interface或离线记 ...
 - 实现 Castor 数据绑定--转
			
第 1 部分: 安装和设置 Castor 数据绑定风靡一时 在 XML 新闻组.邮件列表和网站的讨论论坛中(在 参考资料 中可以找到这些内容的链接),最常见的一个主题就是数据绑定.Java 和 XML ...
 - IOS—通过ChildViewController实现view的切换
			
IOS-通过ChildViewController实现view的切换 在以前,一个UIViewController的View可能有很多小的子view.这些子view很多时候被盖在最后,我们在最外层Vi ...
 - Java_Activiti5_菜鸟也来学Activiti5工作流_之入门简单例子(一)
			
// VacationRequest.java /** * author : 冯孟活 ^_^ * dates : 2015年9月1日 下午10:32:58 * class : 演示简单的公司请假流程 ...
 - WPF Binding值转换器ValueConverter使用简介(一)
			
WPF.Silverlight及Windows Phone程序开发中往往需要将绑定的数据进行特定转换,比如DateTime类型的时间转换为yyyyMMdd的日期,再如有一个值是根据另外多组值的不同而异 ...
 - NSDate和NSString的转换及判定是昨天,今天,明天
			
用于uidate,picker.. +(NSDate*) convertDateFromString:(NSString*)uiDate{ NSDateFormatter *formatter ...
 - Error Creating Deployment 有关Tomcat配置问题
			
配置Tomcat的时候出现提示框The selected server is enabled,but is not configured properly.Deployment to it will ...
 - cas sso单点登录系列8_抛弃Https让Cas以Http协议提供单点登录服务
			
转:http://blog.csdn.net/ycyk_168/article/details/18668951 本文环境: 1.apache-tomcat-7.0.50-windows-x86 2. ...
 - 学C++不得不看的一篇文章[转]
			
1. 扎实的基础.数据结构.离散数学.编译原理,这些是所有计算机科学的基础,如果不掌握他们,很难写出高水平的程序.据我的观察,学计算机专业的人比学其他专业的人更能写出高质量的软件.程序人人都会写,但当 ...
 - js手机站跳转
			
var yunzhuanhua_pc_domain = "http://www.域名.com#yht"; //PC站网址var yunzhuanhua_wap_domain = & ...