前言:
  学习面向对象程序设计的朋友应该知道,我们大多数情况下通过 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的更多相关文章

  1. 设计模式之单例模式--instance

    <?php header('Content-Type:text/html;charest=utf-8'); /** * 设计模式之单例模式 * $_instance必须声明为静态的私有变量 * ...

  2. Python单例模式

    1.单例模式介绍 单例模式,也叫单子模式,是一种常用的软件设计模式.在应用这个模式时, 单例对象的类必须保证只有一个实例存在.许多时候整个系统只需要拥有一个 全局对象,这样有利于我们协调系统整体的行为 ...

  3. Java设计模式学习笔记,一:单例模式

    开始学习Java的设计模式,因为做了很多年C语言,所以语言基础的学习很快,但是面向过程向面向对象的编程思想的转变还是需要耗费很多的代码量的.所有希望通过设计模式的学习,能更深入的学习. 把学习过程中的 ...

  4. Python面试笔记一

    目录 一.MySQL(30题) 二.django(15题) 三.Python部分(46题) 四.RESTful API设计指南(7题) 五.补充 一.MySQL(30题) 1.mysql如何做分页 m ...

  5. Python基础知识:类

    初级篇 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 1.面向对象三大特性 ...

  6. 单例模式在多线程环境下的lazy模式为什么要加两个if(instance==null)

    刚才在看阿寻的博客”C#设计模式学习笔记-单例模式“时,发现了评论里有几个人在问单例模式在多线程环境下为什么lazy模式要加两个if进行判断,评论中的一个哥们剑过不留痕,给他们写了一个demo来告诉他 ...

  7. 设计模式之单例模式(Singleton)

    设计模式之单例模式(Singleton) 设计模式是前辈的一些经验总结之后的精髓,学习设计模式可以针对不同的问题给出更加优雅的解答 单例模式可分为俩种:懒汉模式和饿汉模式.俩种模式分别有不同的优势和缺 ...

  8. GOF23设计模式之单例模式

    ·核心作用: -保证一个类只有一个实例,并且提供一个访问该实例的全局访问点. ·常见应用场景: -Windows的Task Manager(任务管理器)就是很典型的单例模式 -Windows的Recy ...

  9. java设计模式之单例模式(几种写法及比较)

    概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...

随机推荐

  1. 一个App需要的东西

    1.短信申请平台  (发送验证码需要的短信) http://www.yuntongxun.com/api/sms?nl=sy_cp  容联云通讯

  2. BZOJ 1257: [CQOI2007]余数之和sum

    1257: [CQOI2007]余数之和sum Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 3769  Solved: 1734[Submit][St ...

  3. iOS运行时Runtime浅析

    运行时是iOS中一个很重要的概念,iOS运行过程中都会被转化为runtime的C代码执行.例如[target doSomething];会被转化成objc)msgSend(target,@select ...

  4. AFNetworking 与 UIKit+AFNetworking 详解

    资料来源 : http://github.ibireme.com/github/list/ios GitHub : 链接地址 简介 : A delightful iOS and OS X networ ...

  5. P1835 素数密度_NOI导刊2011提高(04)

    题目描述 给定区间[L,R](L≤R≤2147483647,R-L≤1000000),请计算区间中素数的个数. 输入输出格式 输入格式: 两个数L和R. 输出格式: 一行,区间中素数的个数. 输入输出 ...

  6. html中label宽度设置、非替换元素和替换元素

    <label ></label> 单独对label设置一个width:100px的属性石不起作用的,和float:left或者display:inline-block配合的话 ...

  7. SQL2012删除作业失败的处理

    修改msdb数据库中的过程sp_delete_job,如下: USE [msdb] GO /****** Object: StoredProcedure [dbo].[sp_delete_job] S ...

  8. Linux Linux程序练习十四(多进程压力测试)

    /* * 题目: * 编程一个基本多进程测试框架,提示用户输入进程数.和每个进程数运行圈数.(fork) * 进行多进程压力测试.(execve) * 要求父进程能监控所有子进程的退出,避免僵尸进程. ...

  9. angular animate

    angular animate 有3种:1,css transition. 2,css keyframe. 3,javascript 用jquery的animate方法: 1,2 两种是纯粹css的, ...

  10. TinyFrame升级之五:全局缓存的设计及实现

    在任何框架中,缓存都是不可或缺的一部分,本框架亦然.在这个框架中,我们的缓存分为两部分:内存缓存和单次请求缓存.简单说来,就是一个使用微软提供的MemoryCache做扩展,并提供全局唯一实例:另一个 ...