单例模式之怎么实现我的机器人女友
本篇内容介绍了“单例模式之怎么实现我的机器人女友”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
成都创新互联公司专注于浦城企业网站建设,响应式网站建设,成都做商城网站。浦城网站建设公司,为浦城等地区提供建站服务。全流程按需求定制制作,专业设计,全程项目跟踪,成都创新互联公司专业和态度为您提供的服务
程序代码如下:
public class GirlFriend {
private String name;
public GirlFriend(String name) {
this.name = name;
System.out.println("机器人女友制作完成");
}
public void smile() {
System.out.println("笑一个 :-)");
}
public void housework() {
System.out.println("去干家务");
}
public void buKeMiaoShu() {
System.out.println(".......");
}
}
public static void main(String[] args) {
GirlFriend girlFriend = new GirlFriend("小丽");
girlFriend.smile();
girlFriend.housework();
girlFriend.buKeMiaoShu();
}
机器人女友制作完成
笑一个 :-)
去干家务
.......
单例模式
更新后的代码如下:
public class GirlFriend {
private static GirlFriend girlFriend;
private String name;
private GirlFriend(String name) {
this.name = name;
System.out.println("机器人女友制作完成");
}
/**
* 对象通过getInstance方法获取
* @param name
* @return
*/
public static GirlFriend getInstance(String name) {
if(girlFriend == null) {
girlFriend = new GirlFriend(name);
}
return girlFriend;
}
public void smile() {
System.out.println("笑一个 :-)");
}
public void housework() {
System.out.println("去干家务");
}
public void buKeMiaoShu() {
System.out.println(".......");
}
}
public static void main(String[] args) {
GirlFriend girlFriend = GirlFriend.getInstance("小丽");
girlFriend.smile();
girlFriend.housework();
girlFriend.buKeMiaoShu();
}
public static void main(String[] args){
for(int i = 0; i < 5; i++) {
new Thread(new Runnable() {
@Override
public void run() {
GirlFriend girlFriend = GirlFriend.getInstance("小丽");
System.out.println(girlFriend);
}
}).start();
}
}
机器人女友制作完成
singleton.singleton.GirlFriend@95458f7
机器人女友制作完成
机器人女友制作完成
singleton.singleton.GirlFriend@d9d8ad0
singleton.singleton.GirlFriend@383a0ba
singleton.singleton.GirlFriend@d9d8ad0
singleton.singleton.GirlFriend@d9d8ad0
线程1和线程2判断girlFriend的时候如果都为空,就会各自创建一个对象,最后就会返回两个不同的对象了。
懒汉式
/**
* 对象通过getInstance方法获取
* @param name
* @return
*/
public synchronized static GirlFriend getInstance(String name) {
if(girlFriend == null) {
girlFriend = new GirlFriend(name);
}
return girlFriend;
}
饿汉式
public class GirlFriend {
// 在类加载的时候就创建对象,是线程安全的
private static GirlFriend girlFriend = new GirlFriend("小丽");
private String name;
private GirlFriend(String name) {
this.name = name;
System.out.println("机器人女友制作完成");
}
/**
* 对象通过getInstance方法获取
* @return
*/
public static GirlFriend getInstance() {
return girlFriend;
}
public void smile() {
System.out.println("笑一个 :-)");
}
public void housework() {
System.out.println("去干家务");
}
public void buKeMiaoShu() {
System.out.println(".......");
}
}
不支持延迟加载(在真正用到对象的时候,再创建实例),在类加载的时候对象就创建好了,如果对象在整个程序中一次都用不到,提前创建就浪费了。
不能控制对象的数量,我们完全可以声明多个对象,比如:GirlFriend girlFriend1;GirlFriend girlFriend2;GirlFriend girlFriend3。
我们可能没有足够的信息在静态初始化时,实例化每一个对象,对象的构造方法参数,可能要依赖程序后面的运算结果。
双重检测
public class GirlFriend {
// volatile关键字保证了每个线程看到的girlFriend对象都是最新的
private volatile static GirlFriend girlFriend;
private String name;
private GirlFriend(String name) {
this.name = name;
System.out.println("机器人女友制作完成");
}
/**
* 对象通过getInstance方法获取
* @param name
* @return
*/
public static GirlFriend getInstance(String name) {
if(girlFriend == null) {
synchronized (GirlFriend.class) {
if (girlFriend == null) {
girlFriend = new GirlFriend(name);
}
}
}
return girlFriend;
}
public void smile() {
System.out.println("笑一个 :-)");
}
public void housework() {
System.out.println("去干家务");
}
public void buKeMiaoShu() {
System.out.println(".......");
}
}
总结
某个类只能有一个实例
它必须自行创建这个实例
它必须自行向整个系统提供这个实例
“单例模式之怎么实现我的机器人女友”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!
本文标题:单例模式之怎么实现我的机器人女友
标题URL:http://lswzjz.com/article/ijhoge.html