单例模式(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会占用较大的系统资源,所有 ...
随机推荐
- React Hooks实现异步请求实例—useReducer、useContext和useEffect代替Redux方案
本文是学习了2018年新鲜出炉的React Hooks提案之后,针对异步请求数据写的一个案例.注意,本文假设了:1.你已经初步了解hooks的含义了,如果不了解还请移步官方文档.(其实有过翻译的想法, ...
- 埃及分数问题(带乐观估计函数的迭代加深搜索算法-IDA*)
#10022. 「一本通 1.3 练习 1」埃及分数 [题目描述] 在古埃及,人们使用单位分数的和(形如 $\dfrac{1}{a}$ 的,$a$ 是自然数)表示一切有理数.如:$\dfrac{ ...
- Scala本地安装
一.下载 https://www.scala-lang.org/download/ 这里我选择Scala2.10.4版本 二.安装 安装比较简单 和jdk类似 点击一路安装: 选择自己的路径 完成 ...
- Java开发桌面程序学习(10)——css样式表使用以及Button使用
css 样式表使用 javafx中的css样式,与html的有些不一样,javafx中的css,是以-fx-background-color这种样子的,具体可以参考文档JavaFx css官方文档 简 ...
- 《图解HTTP》阅读总结
前言:<图解HTTP>是一本图文并茂的好书,讲解地很详尽.目前我只完整地读了一遍,很多地方知其然不知其所以然,接下来打算抽空再读一次.这篇博文只是做个粗略记录,第二遍读完会再来编辑细化. ...
- [USACO]奶牛会展(背包)
[USACO]奶牛会展 题目背景 奶牛想证明它们是聪明而风趣的.为此,贝西筹备了一个奶牛博览会,她已经对N 头奶牛进行 了面试,确定了每头奶牛的智商和情商. 题目描述 贝西有权选择让哪些奶牛参加展览. ...
- 【LeetCode】未分类(tag里面没有)(共题)
[334]Increasing Triplet Subsequence (2019年2月14日,google tag)(greedy) 给了一个数组 nums,判断是否有三个数字组成子序列,使得子序列 ...
- SpringBoot 利用freemaker生成静态页面
1. <!-- freemarker模板 --> <dependency> <groupId>org.springframework.boot</groupI ...
- 触发写Redo Log的条件
参见:http://www.ixora.com.au/notes/redo_write_triggers.htm http://www.eygle.com/archives/2005/02/redoa ...
- 多组件共享-vuex
1.解决多个组件共享同一状态数据问题1)多个视图共享同一状态2)来自不同视图的触发事件需要变更同一状态文档API:https://vuex.vuejs.org/zh/api/ 2.组件与store连接 ...