黑马程序员技术交流社区
标题: 单例设计模式的写法和说明 [打印本页]
作者: 李大伟 时间: 2013-4-30 10:20
标题: 单例设计模式的写法和说明
本帖最后由 李大伟 于 2013-4-30 16:15 编辑
求单例设计模式写法,和说明,详细 ,谢谢
作者: 本人已死 时间: 2013-4-30 10:29
这是我从别地方烤来的希望对你有帮助
解决的问题:保证一个类在内存中的对象唯一性。
比如:多程序读取一个配置文件时,建议配置文件封装成对象。会方便操作其中数据,又要保证多个程序读到的是同一个配置文件对象,就需要该配置文件对象在内存中是唯一的。
Runtime()方法就是单例设计模式进行设计的。
如何保证对象唯一性呢?
思想:
1,不让其他程序创建该类对象。
2,在本类中创建一个本类对象。
3,对外提供方法,让其他程序获取这个对象。
步骤:
1,因为创建对象都需要构造函数初始化,只要将本类中的构造函数私有化,其他程序就无法再创建该类对象;
2,就在类中创建一个本类的对象;
3,定义一个方法,返回该对象,让其他程序可以通过方法就得到本类对象。(作用:可控)
代码体现:
1,私有化构造函数;
2,创建私有并静态的本类对象;
3,定义公有并静态的方法,返回该对象。
---------------------------------------------
//饿汉式
class Single{
private Single(){} //私有化构造函数。
private static Single s = new Single(); //创建私有并静态的本类对象。
public static Single getInstance(){ //定义公有并静态的方法,返回该对象。
return s;
}
}
---------------------------------------------
//懒汉式:延迟加载方式。
class Single2{
private Single2(){}
private static Single2 s = null;
public static Single2 getInstance(){
if(s==null)
s = new Single2();
return s;
}
}
作者: 李大伟 时间: 2013-4-30 11:52
本人已死 发表于 2013-4-30 10:29
这是我从别地方烤来的希望对你有帮助
解决的问题:保证一个类在内存中的对象唯一性。比如:多程序读取一个 ...
饿汉式 private static Single s = new Single();
是卸载私有化构造函数的前边还是后边啊!!!
作者: 芦玉明 时间: 2013-4-30 12:44
下面是我通过学习毕老师java基础视频,自己总结出来的。
单例设计模式:解决一个类在内存只存在一个对象。
思想:想要保住对象唯一。
<1>.为了避免其他程序过多建立该类对象,先禁止其他程序建立该类对象。
<2>.还为了让其他程序可以访问到该类对象,只好在本类中,自定义一个对象。
<3>.为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式。
这三步怎么用代码体现呢?
<1>.将构造函数私有化。
<2>.在本类中创建一个本类对象。
<3>.提供一个方法可以获取到该对象。
注意:对于事物该怎么描述,还怎么描述。
当需要将该事物的对象保证在内存中唯一时,就将以上三步加上即可。
(一)这个是先初始化对象。称为:饿汉式
饿汉式代码如下:- class Single
- {
- private Single(){} //禁止其他程序创建本类对象,将构造函数私有化。
- private static Single s = new Single();//静态方法访问静态成员,所以static修饰
- public static Single getInstance() //静态修饰,供其他程序类名调用。
- {
- return s;
- }
- }
- class SingleDemo
- {
- public static void main(String[] args)
- {
- Single ss = Single.getInstance();
- }
- }
复制代码 其他程序只能通过getInstance()方法来操作本类对象了。
方法被调用只有两种方式可以进行:1,建立对象 2,类名调用。
构造函数已被私有了,不可能建立对象了。
方法只能用被类名调用,能用类名调用,这个方法就要static标识。
同时静态方法在访问类中的成员s,所以成员 s 也要被static。
s同时是类中的变量,所以通常要private。
特点: 这种单例设计模式称为懒汉式。在调用getInstance()方法时,
这唯一对象的就创建好了,直接拿到使用。这种思想是空间换时间
对象早早的建立好存放在那,只有来拿就好了。
(二)对象是方法被调用时,才初始化,也叫做对象的延时加载。称为:懒汉式
懒汉式代码:- class Single
- {
- private static Single s = null;
- private Single(){}
- public static Single getInstance()
- {
- if(s==null)
- {
- synchronized(Single.class)
- {
- if(s==null)
- s = new Single();
- }
- }
- return s;
- }
- }
复制代码 特点:这种单例设计模式的特点是当通过对外提供的取得单例的方式获取对象时,
先判断对象时候存在,如果不存在,那么就创建一个,否则直接使用已经存在的对象。
但是,if(s == null )这句话容易出现并发操作,如果两个线程同时来取对象,
判断条件为null,那么就会创建多个对象,所以当判断条件后,再使用一个同步代码块
来实现线程的同步,再在里面使用if判断,来判断对象是否存在。这种使用双重if判断
以及使用同步关键synchronized的方式可以稍微提高一下效率。
这种单例模式设计的思想是:时间换空间。当通过getInstance()来获取对象时,
才创建实例,这样可以节省空间,但是效率略低。
记录原则:定义单例建议使用饿汉式。
作者: 陈国斌 时间: 2013-4-30 13:35
格式和相关说明大家已经提了不少了,我也没啥补充的,我用单例设计模式写个生产消费的例子吧,希望能帮到你- class Resource
- {
- private String name;
- private int count = 0;
- boolean flag = false;
- private Resource(){}
- private static final Resource r = new Resource();
- public static Resource getInstance()
- {
- return r;
- }
- public synchronized void set(String name)
- {
- while(flag)
- try{this.wait();}catch(Exception e){};
- this.name = name;
- System.out.println(Thread.currentThread().getName()+"..."+this.name+"..."+(++count));
- flag = true;
- this.notifyAll();
- }
- public synchronized void out()
- {
- while(!flag)
- try{this.wait();}catch(Exception e){};
- System.out.println(Thread.currentThread().getName()+"......"+name+"..."+count);
- flag = false;
- this.notify();
- }
- }
- class Input implements Runnable
- {
- Resource rs = Resource.getInstance();
- public void run()
- {
- while(true)
- {
- rs.set("商品");
- }
- }
- }
- class Output implements Runnable
- {
- Resource rs1 = Resource.getInstance();
- public void run()
- {
- while(true)
- {
- rs1.out();
- }
- }
- }
- class ShengchanXiaofeiDanli
- {
- public static void main(String[] args)
- {
- new Thread(new Input()).start();
- new Thread(new Input()).start();
- new Thread(new Output()).start();
- new Thread(new Output()).start();
- }
- }
复制代码
作者: 花开花落总相似 时间: 2013-4-30 14:11
上面大家都说很多了 我也不给你总结了 我给你说下是哪个视频吧 毕向东老师 在第六天 第9个和第十个10频中有简单说明
作者: 李大伟 时间: 2013-4-30 16:15
好的明白了,谢谢大家
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |