单例模式:Instance
前言:
学习面向对象程序设计的朋友应该知道,我们大多数情况下通过 new 操作来实例化对象的。对于一些仅需要一次初始化的对象来说,频繁的new操作无疑会过多浪费内存空间。基于此,单例模式便应运而生了。所谓单例,即"一次初始化,多次操作"。那么本文就介绍一下自己封装一个支持单例的类的主要步骤。
实现单例的3个要点:
·静态化实例;
·将构造方法封装为private;
·对外提供一个公开的getInstance()方法。

代码实现:
package com.modelDesign.instance;
public class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private Person(){
}
private static Person pp=new Person();
public static Person getInstance(){
return pp;
}
}
客户端测试程序:
package com.modelDesign.instance;
public class TestPerson {
public static void main(String[] args) {
Person p1 = Person.getInstance();
p1.setName("Jack");
Person p2 = Person.getInstance();
System.out.println("是否单例:"+(p1==p2));
System.out.println(p2.getName());
}
}
测试结果:

补充:
当你设计的应用涉及到多线程时,上面的代码还是有瑕疵的。由于线程与线程之间的冲突,很可能会造成多次初始化。由此,我们引入多线程的锁——Lock加以解决。
适应多线程的单例实现:
package com.modelDesign.instance; import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; public class InstanceSuper { private static InstanceSuper instance;
private static Lock lock=new ReentrantLock();
private InstanceSuper() {
}
public static InstanceSuper getInstance(){
if(instance==null){
lock.lock();
if(instance==null){
instance = new InstanceSuper();
}
lock.unlock();
}
return instance;
} }
注意:测试类不要包含在单例类中,因为同一个类中私有的构造方法同样可以被其他方法调用,也就是说在main()函数进行new操作时不会报错!!
单例模式:Instance的更多相关文章
- 设计模式之单例模式--instance
<?php header('Content-Type:text/html;charest=utf-8'); /** * 设计模式之单例模式 * $_instance必须声明为静态的私有变量 * ...
- Python单例模式
1.单例模式介绍 单例模式,也叫单子模式,是一种常用的软件设计模式.在应用这个模式时, 单例对象的类必须保证只有一个实例存在.许多时候整个系统只需要拥有一个 全局对象,这样有利于我们协调系统整体的行为 ...
- Java设计模式学习笔记,一:单例模式
开始学习Java的设计模式,因为做了很多年C语言,所以语言基础的学习很快,但是面向过程向面向对象的编程思想的转变还是需要耗费很多的代码量的.所有希望通过设计模式的学习,能更深入的学习. 把学习过程中的 ...
- Python面试笔记一
目录 一.MySQL(30题) 二.django(15题) 三.Python部分(46题) 四.RESTful API设计指南(7题) 五.补充 一.MySQL(30题) 1.mysql如何做分页 m ...
- Python基础知识:类
初级篇 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 1.面向对象三大特性 ...
- 单例模式在多线程环境下的lazy模式为什么要加两个if(instance==null)
刚才在看阿寻的博客”C#设计模式学习笔记-单例模式“时,发现了评论里有几个人在问单例模式在多线程环境下为什么lazy模式要加两个if进行判断,评论中的一个哥们剑过不留痕,给他们写了一个demo来告诉他 ...
- 设计模式之单例模式(Singleton)
设计模式之单例模式(Singleton) 设计模式是前辈的一些经验总结之后的精髓,学习设计模式可以针对不同的问题给出更加优雅的解答 单例模式可分为俩种:懒汉模式和饿汉模式.俩种模式分别有不同的优势和缺 ...
- GOF23设计模式之单例模式
·核心作用: -保证一个类只有一个实例,并且提供一个访问该实例的全局访问点. ·常见应用场景: -Windows的Task Manager(任务管理器)就是很典型的单例模式 -Windows的Recy ...
- java设计模式之单例模式(几种写法及比较)
概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...
随机推荐
- luogu1328[NOIP2014 T1]生活大爆炸版石头剪刀布
题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负.在<生活大爆炸>第二季第8 集中出现了一种石头剪刀布的升级版游戏. 升级版游戏在传统的 ...
- Samsung I9103刷cm-10.1的方法
按照官方网站的说明一步一步的做下去的时候发现在执行heimdall.exe文件的时候出现“不是win32的应用程序”的错误提示,因此决定按照其它方法安装recovery,然后再刷入CM10.1. sa ...
- Nginx 使用IP限制访问来源
在 server {... 下, 或者在 location xxx {... 下, 都可以添加如下的IP访问限制 allow 10.57.22.172; allow ; allow ; allow ; ...
- Java中HashSet,HashMap和HashTable的区别
HashMap.HashSet.HashTable之间的区别是Java程序员的一个常见面试题目,在此仅以此博客记录,并深入源代码进行分析: 在分析之前,先将其区别列于下面 1:HashSet底层采用的 ...
- P1835 素数密度_NOI导刊2011提高(04)
题目描述 给定区间[L,R](L≤R≤2147483647,R-L≤1000000),请计算区间中素数的个数. 输入输出格式 输入格式: 两个数L和R. 输出格式: 一行,区间中素数的个数. 输入输出 ...
- C#.NET 大型通用信息化系统集成快速开发平台 4.0 版本 - 组织机构的名称编号是否允许重复?
通常情况下,一个公司内部的部门名称,编号是不可能重复的.但是是在多公司的情况下,很可能有部门名称重复的问题存在,这时需要允许部门名称重复. 例如一个大型IT公司,在2个地区都有研发部或者客户服务部,这 ...
- C++ 中dynamic_cast<>的使用方法小结 -判断类型-rtti
将一个基类对象指针(或引用)cast到继承类指针,dynamic_cast会根据基类指针是否真正指向继承类指针来做相应处理 即会作一定的判断. 对指针进行dynamic ...
- 数据库Mark.2
select count(*) as count,DATE_SUB('2016-10-04',INTERVAL regDay DAY) from result_1005 group by DATE_S ...
- jquery-barcode:js实现的条码打印
这是一个纯js的jQuery插件,项目地址:http://barcode-coder.com/en/barcode-jquery-plugin-201.html 使用示例: <!doctype ...
- Java 生成 UUID
1.UUID 简介 UUID含义是通用唯一识别码 (Universally Unique Identifier),这是一个软件建构的标准,也是被开源软件基金会 (Open Software Found ...