黑马程序员_Java基础[11]_单列设计模式
来源:互联网 发布:海王星2.0软件下载 编辑:程序博客网 时间:2024/05/17 02:19
【扩编知识】
设计模式 JOF 解决某一类问题最行之有效的方法。
java中,有23种设计模式
学习其中一个:
【单例设计模式】:
解决一个类在内存中只存在一个对象。
(只能new出一个程序。)
想要保证对象唯一。
1,为了避免其他程序过多建立该类对象,先禁止其他程序建立该对象。
2,还为了其他程序可以访问到该类对象,只好在本类中自定义一个对象。
3,为了方便其他程序对自定义对象的访问,可以提供一些访问方式。
那么这三步如何用代码体现?
1,构造函数私有化。
2,在类中,创建一个本类对象。
3,提供一个方法,可以获取到该对象。
执行步奏:
1,执行main方法后, 内存中立刻生成【栈】,【堆】,【方法区】
2,在【栈】中生成了ss
3,在【方法区】中,加载出静态属性和方法:static s和 static getInstance()方法。
4,在【堆】中生成对象:new Single();给出一个地址值:假设为0x001指向【方法区】中s的值
5,当使用static getInstance()时,return s就是返回出s的值,即地址值,
6,所以ss=s=s的地址值。
7,假设再次new出一个ss2, 同理,也会指向这个地址值。
【例子】单例设计模式:常用饿汉式
* 设计模式 ,java中有23中
对应两种写法
a,称为饿汉式 是先初始化对象 开发一般用该方法。
b,为懒汉式 对象是方法被调用时,才初始化,也叫做对象的延时加载。
两种方法都差不多。
相比较,懒汉式没那么安全。
【定义单列,建议使用饿汉式】
不同处,懒汉式加载的时候,方法区的该类下的对象名,是null,而饿汉式对象名指向的是地址,是已经有了一个对象。
*/
package DayXuexi;
class Single{
/*[a]Single2 为另一种写法
称为饿汉式 是先初始化对象
*/
private Single(){}//把私有修饰符去掉则可以new对象。
static Single s=new Single();
public static Single getInstance(){
return s;
}
//OK 唯一化已经搞定,现在我们来实验一下:
private int num;
public void setNum(int num){//写
this.num=num;
}
public int getNum(){//读
return num;
}
}
class Single2{
/*[b]Single 为另一种写法
* Single 类进内存,对象还没有存在,只有调用了getInstance方法时才建立对象。
*/
private Single2(){}
private static Single2 s2=null;
public static Single2 getInstance(){
//为了避免一些情况 该方法最好添加一个锁 synchronized 同步同时该方法的效率就变低了。。(多线程知识点)
//public static synchronized Single2 getInstance(){//这样写效率很低,还是注释掉。
//为了更安全,更效率 把代码更改为:
//if(s2==null){
// s2=new Single2();
//}
if(s2==null){
synchronized(Single.class){
if(s2==null){
s2=new Single2();//虽然效率高了,但是代码量又变多了,所以综合后,还是饿汉式常用。
}
}
}
return s2;
}
}
public class Dome_SheJiMoShi {
public static void main(String []args){
//new Single();
//Single ss=new Single(); 这样是无法new的
//Single.getInstance();//得这样:
Single ss=Single.getInstance();//[1]
//System.out.println(Single.getInstance());
System.out.println(ss);
//实验代码:
Single s1=Single.getInstance();
Single s2=Single.getInstance();
s1.setNum(30);
//s2值会是几? 如果s1s2都是new出来的又是几呢?
System.out.println(s2.getNum());
}
}
黑马官网: http://edu.csdn.net/heima
- 黑马程序员_Java基础[11]_单列设计模式
- 黑马程序员_Java基础_装饰设计模式
- 黑马程序员_java入门_设计模式
- 黑马程序员_java语言_设计模式
- 黑马程序员---单列设计模式
- 黑马程序员 单列设计模式
- 黑马程序员_日记(一)_java基础_装饰设计模式思想
- 黑马程序员——JAVA基础之单列设计模式
- 黑马程序员_Java基础_线程基础,创建,同步(单例设计模式的同步),死锁
- 黑马程序员_Java基础_抽象类,模板设计模式,接口,内部类,多态
- 黑马程序员_Java基础[14]_模版设计模式、习题练习
- 黑马程序员_JAVA基础_单例模式
- 黑马程序员_java语言_多线程和设计模式
- 黑马程序员_10_单列设计模式
- 黑马程序员--java单列设计模式
- 黑马程序员_Java基础_编程基础
- 黑马程序员_Java基础_面向对象,封装,继承,单例设计模式,构造函数,构造代码块
- 黑马程序员_java基础学习笔记11_反射
- 记一下ADC一些关键指标的计算
- c++ RTTI(运行时类型识别)
- uva 1530 - Floating Point Numbers(数论)
- 《梦断代码》摘录及感悟
- 吉他笔记 solo 和弦 推弦 音程
- 黑马程序员_Java基础[11]_单列设计模式
- 递归:求螺旋排列数字的矩阵
- HDU1019 Least Common Multiple
- 玩转html5(四)----使用canvas画一个时钟(可以动的哦!)
- poj 2488 A Knight's Journey
- [每日一算法]排序之插入排序
- 关于URL编码
- erlang在windows下和虚拟机节点通信
- linux网络编程二十三:高性能定时器之时间堆