单例模式(Singleton Patten)
顾名思义,单例模式就是只有一个实例,不管怎样,使用了单例模式的类在系统中只有一个对象被访问到。Java中单例模式定义:“一个类有且仅有一个实例,并且这个类会自行实例化,实例化时候的对象可以提供给整个系统。”
动机: 对于系统中的某些类来说,只有一个实例是很重要的,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。如在Windows中就只能打开一个任务管理器。如果不使用机制对窗口对象进行唯一化,将弹出多个窗口,如果这些窗口显示的内容完全一致,则是重复对象,浪费内存资源;如果这些窗口显示的内容不一致,则意味着在某一瞬间系统有多个状态,与实际不符,也会给用户带来误解,不知道哪一个才是真实的状态。因此有时确保系统中某个对象的唯一性即一个类只能有一个实例非常重要。
实现过程:
显然单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例
,就是以下三点:
1、单例模式的类只提供私有的构造函数(通过控制构造函数来显示类的实例的生成过程 构造函数私有化 只能有本类来创建本类的实例)
2、类定义中含有一个该类的静态私有对象的引用private static 单例类的引用名=new 单例类的方法( );这种构造模式下仅仅在这个部分执行了一次构造函数。
3、该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。(这个相当于提供给外部的一个方法 通过这个方法 可以获得这个类的实例)
因为是static的 该类对象只有一个实例,不会没new一次该实例,又因为构造函数是私有的,在定义类的时候已经生成了单一的实例变量。只能通过 Classname.单例类的引用名 这样的方式来访问这个实例变量 无法再生成新的实例变量了(构造函数私有),又因为是私有的,仅仅能通过共有的函数入口来进行访问,外部的类无法对该实例进行修改。
内在的逻辑思路:
要求只能生成一个实例—>将构造函数私有化—>保证外部的程序无法通过new来产生新的实例对象—>在外部无法生成实例对象—>没法通过对象来调用实例方法—>只能通过类方法来返回一个实例对象—>静态方法只能访问静态属性—>所以在类内部生成的实例属性也要是static类型的
三个关键点:
1、构造函数私有
2、静态成员变量引用自身类的实例对象
3、向外部提供getinstance函数来访问内部的static实例
具体代码如下:
package com.designpatten.SingletonPatten;
/*
* 实现了一个单例模式
*/
public class SingletonPatten {
//初始化函数
private SingletonPatten()
{
System.out.println("creat a new instance");
}
private int number=0;
private static SingletonPatten singlepatten=new SingletonPatten();
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public static SingletonPatten getinstance(){
System.out.println("evoke the instance");
//注意调用私有static属性的时候不用加this 因为static属性属于整个类
return singlepatten;
}
}
/*
* 可以看出来 仅仅有一个实例 调用了一次构造函数creat a new instance (仅仅被调用了一次)
* 虽然每次都生成了新的实例 但是只有一个实例
*/
public class Test {
public static void main (String[]args)
{
SingletonPatten s1=SingletonPatten.getinstance();
System.out.println(s1.getNumber());
s1.setNumber(1);
SingletonPatten s2=SingletonPatten.getinstance();
System.out.println(s2.getNumber());
s2.setNumber(2);
SingletonPatten s3=SingletonPatten.getinstance();
System.out.println(s3.getNumber());
System.out.println(s1==s2);
System.out.println(s2==s3);
}
}
执行结果:
creat a new instance
evoke the instance
0
evoke the instance
1
evoke the instance
2
true
true
可以看出来 s1 s2 s3三个引用指向的是相同的地址空间,仅仅生成了一个实例。
单例模式(Singleton Patten)的更多相关文章
- 设计模式之单例模式——Singleton
设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有 ...
- 【白话设计模式四】单例模式(Singleton)
转自:https://my.oschina.net/xianggao/blog/616385 0 系列目录 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factor ...
- ooad单例模式-Singleton
单例模式Singleton 主要作用是保证在Java应用程序中,一个类Class只有一个实例存在. 比如建立目录 ...
- iOS单例模式(Singleton)写法简析
单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 1.单例模式的要点: 显然单例模式的要点有三个:一是某个类只能有一个实例: ...
- 浅谈设计模式--单例模式(Singleton Pattern)
题外话:好久没写blog,做知识归纳整理了.本来设计模式就是个坑,各种文章也写烂了.不过,不是自己写的东西,缺少点知识的存在感.目前还没做到光看即能记住,得写.所以准备跳入设计模式这个大坑. 开篇先贡 ...
- 设计模式之——单例模式(Singleton)的常见应用场景
单例模式(Singleton)也叫单态模式,是设计模式中最为简单的一种模式,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象,也因此 ...
- 设计模式之单例模式(Singleton Pattern)
单例模式 单例模式(Singleton Pattern)在java中算是最常用的设计模式之一,主要用于控制控制类实例的数量,防止外部实例化或者修改.单例模式在某些场景下可以提高系统运行效率.实现中的主 ...
- 设计模式(4) -- 单例模式(Singleton)
设计模式(4) -- 单例模式(Singleton) 试想一个读取配置文件的需求,创建完读取类后通过New一个类的实例来读取配置文件的内容,在系统运行期间,系统中会存在很多个该类的实例对象,也就是说 ...
- IOS单例模式(Singleton)
IOS单例模式(Singleton) 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 1.单例模式的要点: 显然单例模 ...
- java设计模式之 单例模式 Singleton
static 的应用 单例模式 Singleton 单例:保证一个类在系统中最多只创建一个实例. 好处:由于过多创建对象实例,会产生过多的系统垃圾,需要GC频繁回收,由于GC会占用较大的系统资源,所有 ...
随机推荐
- VBA中Let与Set的区别
Let与Set的区别 1.在“类模块”中 Property Let 语句 在Class块中,是给普通变量进行赋值操作的Property,该种Property将不能在其前面使用Set,因而将不能用户对对 ...
- sys模块与shutil模块
#coding=utf-8 import sys ## sys.argv #从命令行获取参数 import shutil #文件.文件夹.压缩包.处理模块 f1 = open("test.t ...
- 11-jQuery简介和选择器
# jQuery > jQuery是一个是免费.开源的javascript库, 也是目前使用最广泛的javascript函数库.>> jQuery极大的方便你完成web前段的相关操作 ...
- iBatis.Net 语句 获取Identity ID
<insert id="Table_Operate_Id" parameterClass="Entity" resultClass="Syste ...
- C# 开发 Windows 服务 使用Log4net 组件 不能生成日志文件
使用VS2012开发Windows服务,需要使用Log4net日志组件记录业务情况,但是始终生成不了日志文件. /// <summary> /// 入口方法 /// </summar ...
- Java 根据银行卡号获取银行名称以及图标
转 https://blog.csdn.net/N_007/article/details/78835526 参考 CNBankCard 中国各大银行卡号查询 一.支付宝接口获取名称 根据 卡号 获取 ...
- springboot 整合Druid
Druid连接池监控配置 1) 引入依赖 <!-- https://mvnrepository.com/artifact/com.alibaba/druid --> <depende ...
- Django登录(含随机生成图片验证码)注册实例
登录,生成随机图片验证码 一.登录 - 随机生成图片验证码 1.随机生成验证码 Python随机生成图片验证码,需要使用PIL模块,安装方式如下: pip3 install pillow 1)创建图片 ...
- 【leetcode】885. Boats to Save People
题目如下: 解题思路:本题可以采用贪心算法,因为每条船最多只能坐两人,所以在选定其中一人的情况下,再选择第二个人使得两人的体重最接近limit.考虑到人的总数最大是50000,而每个人的体重最大是30 ...
- UI自动化前置代码
一.前置代码: #导入包selenium from selenium import webdriverimport time#创键一个火狐对象driver=webdriver.Firefox()#防问 ...