黑马程序员——单例设计模式

---------------------- android培训java培训、期待与您交流! 

  单例设计模式,在我们团队一个月以前的一个交流短会上,一个学长刚好介绍了一下这个东西,但是当时就是听得云里雾里的,不明白他在讲啥,然后看毕老师的视频,刚好就讲了它,挺巧的。

 所谓单例模式,就是自己写的一个类,处于安全等方面的原因,不希望使用者再去建立对象,在整个程序中就只能有一个对象。

 实现思路:首先,将构造函数私有化,让使用者不能new它,然后,在类的本身建立一个对象,然后通过一个public方法给出,这样使用者在使用的时候就只能使用这个方法来调用那个唯一对象。除此之外,其他方法跟普通的类一样。这样也不会影响其他方法的使用。


从对象的初始化时间来看,有两种模式,即:饿汉式和懒汉式

1.饿汉式:既然饿,就想快点吃,所以在开始的时候就给出对象,此模式线程安全。

代码:

class Person{
	   private String name;
	  private  int age;
	  private Person(){};
	  Person p=new Person();
	  public Person getInstance(){
		  return p;
	  }
	public void setName(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
	}

这样,在使用此类的时候,就不能用Person p=new Person()来建立对象了(因为构造函数已经私有化)。想要使用此类,就只能使用 Person p=Person.getinstance();来实现。

2.懒汉式:既然懒,在声明p的时候,就不想去建立对象,在使用的时候才会建立对象。

代码:

class Person{
	   private String name;
	  private  int age;
	  private Person(){};
	  Person p;
	  public Person getInstance(){
		  if(p==null) p=new Person();
		  return p;
	  }
	public void setName(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
	}

这个模式(也叫单例模式的延迟加载对象),在被调用instance对象,这样节约资源,但是也存在一个问题,就是如果是多线程操作此类,某一线程在刚好进入getinstance()方法的时候失去了CPU的控制权,然后另一个线程也刚好执行此操作,就可能造成建立两个对象。所以  必须加上线程锁:

改后代码:

class Person{
	   private String name;
	  private  int age;
	  private Person(){};
	  Person p;
	  public synchronized Person getInstance(){
		  if(p==null) p=new Person();
		  return p;
	  }
	public void setName(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
	}

这样就保证了在线程进入getInstance()方法后就必须执行完才交出CUP控制权,从而解除了线程安全的问题。




-------------------------------------------- android培训java培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net/heima

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值