单例模式(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会占用较大的系统资源,所有 ...
随机推荐
- 游戏服务端pomelo完整安装配置过程
版权声明:本文为博主原创文章,转载或又一次发表请先与我联系. https://blog.csdn.net/jonahzheng/article/details/27658985 游戏服务端pomelo ...
- jQuery的加法运算,val()获取的结果相加变成了字符串连接。
加法运算 ?想必大家听到这都会不屑了,加法运算这是多么简单的运算.然而有的时候在jQuery也让人挺头疼的. 常规的是: var num1 = 123; var num2=123; var total ...
- SwiftUI 实战:从 0 到 1 研发一个 App
心得感悟 起初看到 WWDC 上的演示 SwiftUI 时,我就觉得 SwiftUI 有种陌生的熟悉感(声明式语法),所以体验下,看看有没有什么启发. 先说下整体项目完成下来的感受: 用 Swift ...
- SwiftUI 里的 swift 闭包总结
创建 UI 时的闭包使用 在 SwiftUI 里闭包出现的频率特别高,这里我重新梳理了下闭包的定义. 关于闭包 闭包表达式语法的一般形式如下: {(parameters) -> return t ...
- pg_config - 检索已安装版本的 PostgreSQL 的信息
SYNOPSIS pg_config {--bindir | --includedir | --includedir-server | --libdir | --pkglibdir | --confi ...
- 转载:CentOS yum 源的配置与使用
转载自:http://www.cnblogs.com/mchina/archive/2013/01/04/2842275.html 一.yum 简介 yum,是Yellow dog Updater, ...
- openprocess提升为测试权限
BOOL EnableDebugPrivilege() { HANDLE hToken; BOOL fOk=FALSE; if(OpenProcessToken(GetCurrentProcess() ...
- CSP-S2019 停课日记
前言 不想上文化课,于是就停课了 (雾) \(10.13\) 停课前一天 今天名义上是放假,所以不算停课. 老师和同学们听说我要停课,都十分的不舍.我啥也没说就悄悄溜到一中来了. \(10.14\) ...
- CS与BS的比较
对象 硬件环境 客户端要 求 软件安装 升级和维护 安全性 C/S 用户固定,并且处于相同区域, 要求拥有相同的操作系统. 客户端的计算机电脑配置要求较高. 每一个客户端都必须安装 ...
- JS原型链详解(2)
深入理解javascript原型链 在javascript中原型和原型链是一个很神奇的东西,对于大多数人也是最难理解的一部分,掌握原型和原型链的本质是javascript进阶的重要一环.今天我分享一下 ...