Java 中设计模式 (单例模式) 介绍
2015-08-19 20:07
225 查看
需求 :保证了一个类在内存中只能有一个对象
思路:1、如果其他程序能够随意用new创建该类对象,那么就无法控制个数。因此,不让其他程序用new创建该类的对象。
2、既然不让其他程序new该类对象,那么该类在自己内部就要创建一个对象,否则该类就永远无法创建对象了。
3、该类将创建的对象对外(整个系统)提供,让其他程序获取并使用。
解决步骤:1、 将该类中的构造函数私有化。
2、在本类中创建一个本类对象。
3、定义一个方法,返回值类型是本类类型。让其他程序通过该方法就可以获取到该类对象。
单例的设计模式包括:
饿汉式
懒汉式
饿汉式 介绍:
在开始时就 new 对象
简单代码实现
懒汉式:
和饿汉式不同,再调用的时候进行判断 new对象;
在判断时候需要将其上锁,不然会出现问题(本人清测)
线程A希望使用SingletonClass,调用getInstance()方法。因为是第一次调用,A就发现instance是null的,于是它开始创建实例,就在这个时候,CPU发生时间片切换,线程B开始执行,它要使用SingletonClass,调用getInstance()方法,同样检测到instance是null——注意,这是在A检测完之后切换的,也就是说A并没有来得及创建对象——因此B开始创建。B创建完成后,切换到A继续执行,因为它已经检测完了,所以A不会再检测一遍,它会直接创建对象。这样,线程A和B各自拥有一个SingletonClass的对象——单例失败!
设计思想高深,这个只是简单的用代码稍微的演示下,下面是调用上面的测试程序
思路:1、如果其他程序能够随意用new创建该类对象,那么就无法控制个数。因此,不让其他程序用new创建该类的对象。
2、既然不让其他程序new该类对象,那么该类在自己内部就要创建一个对象,否则该类就永远无法创建对象了。
3、该类将创建的对象对外(整个系统)提供,让其他程序获取并使用。
解决步骤:1、 将该类中的构造函数私有化。
2、在本类中创建一个本类对象。
3、定义一个方法,返回值类型是本类类型。让其他程序通过该方法就可以获取到该类对象。
单例的设计模式包括:
饿汉式
懒汉式
饿汉式 介绍:
在开始时就 new 对象
简单代码实现
package cn.hncu.designl.sigal; //饿汉式 public class P1 { private static final P1 p=new P1();//为了不让直接访问,将其私有化 private P1(){};//构造方法私有化 public static P1 get(){//通过类名可以掉这个方法,从而可以访问到私有的构造函数 System.out.println("11111111"); return p;//返回可以造对象的p } }
懒汉式:
和饿汉式不同,再调用的时候进行判断 new对象;
在判断时候需要将其上锁,不然会出现问题(本人清测)
线程A希望使用SingletonClass,调用getInstance()方法。因为是第一次调用,A就发现instance是null的,于是它开始创建实例,就在这个时候,CPU发生时间片切换,线程B开始执行,它要使用SingletonClass,调用getInstance()方法,同样检测到instance是null——注意,这是在A检测完之后切换的,也就是说A并没有来得及创建对象——因此B开始创建。B创建完成后,切换到A继续执行,因为它已经检测完了,所以A不会再检测一遍,它会直接创建对象。这样,线程A和B各自拥有一个SingletonClass的对象——单例失败!
package cn.hncu.designl.sigal; public class P2 { private static P2 p=null;//与饿汉式不一样,这里先不要new 对象,但是同样的私有化 private P2(){}//私有化 public static synchronized P2 getinstance(){//若是多线程会出现错误(本人清测),所以需要synchronized将其锁起来 if(p==null){//为空就直接new 对象 p=new P2(); } return p;//返回 造的对象 } }
设计思想高深,这个只是简单的用代码稍微的演示下,下面是调用上面的测试程序
package cn.hncu.designl.sigal; public class test { public static void main(String[] args) { P1 p1=P1.get(); P1 p2=P1.get(); System.out.println(p1==p2);//饿汉式单模式//直接就赋值 //懒汉式 P2 p3=P2.getinstance();//类名直接调 P2 p4=P2.getinstance(); System.out.println(p3==p4); } }
相关文章推荐
- Javascrpt 速成篇】 二:js面向对象
- .svn导致java项目无法编译
- JAVA 多线程编程 --线程的调度策略
- Java内存区域划分、内存分配原理
- [Java] switch-case 当中的变量定义
- Eclipse下用Maven搭建SpringMvc+MyBatis
- Spring Hibernate 开启事务
- Java基于数据源的数据库访问
- 详解。。java设计思想与设计模式------Beginer
- Java集合总览
- Struts(3)工作机制及分析
- Struts(2)环境搭建
- java 输出流和输入流
- Struts(1)初识Struts
- java 操作war文件
- java中将由数字组成的字符串型(String)转换成整型(int)
- Java IO流 装饰 字节流--19
- 快速生成java中的setter和getter
- Java记录
- 【Java】-基础-线程