大家可以copy代码运行一下。这样更直观一些,虽然这些东西很粗浅,但是敲一下会加深印象自己敲最好
设计模式:单例
单例模式有:饿汉式,懒汉式,登记式。
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
单例的特点:
一:单例类只能有一个实例。
二:单例类必须自己自己创建自己的唯一实例。
三:单例类必须给所有其他对象提供这一实例。
下面来看一下不使用单例面模式的类:
package itheiomatest;
public class Main {
public static void main(String[] args) {
//new 两个notSingle类的实例,并给里面的属性a赋值
NotSingle ns=new NotSingle();
NotSingle ns1=new NotSingle();
ns.setA(2);
ns.show();
ns1.show();
}
}
class NotSingle{
public NotSingle(){
}
private int a;
public void setA(int a ){
this.a=a;
}
public void show(){
System.out.println(this.a);
}
}
从上面的代码可以看出,我们实例化出两个NotSingle类的对象以后,ns和ns1都有自己指向的地址,也就是他们的地址不指向同一个对象。所以当给ns里面的a属性赋值后并不会影响ns1对象里面属性 a的值。
下面使用单例模式来创建一个类:
饿汉式:
创建步骤:
1.私有化构造函数。
2.在类中创建一个本类对象。
3.提供一个方法可以获得该对象。
package itheiomatest;
public class Main {
public static void main(String[] args) {
//new 两个notSingle类的实例,并给里面的属性a赋值
Single s=Single.getInstance();
s.setA(3);
s.Show();
Single s1=Single.getInstance();
s1.Show();
}
}
class Single{
//私有化构造方法
private Single(){
}
//创建一个私有的本类对象
private static Single s=new Single();
//提供一个公共的方法获得该类的实例
public static Single getInstance(){
return s;
}
private int a;
public void setA(int a ){
this.a=a;
}
public void Show(){
System.out.println(this.a);
}
}
我们在上面的main函数的代码中通过Single.getInstance()得到了两个Single类的实例s1,s2,我们只给s实例里面的a属性赋值为3,s1实例里面的属性a并没有赋值,但是当我们调用s和s1的Show()方法时,输出的都是a为3。这是因为s和s1实例的指向地址相同。都指向Single类里面的s。
懒汉式:
package itheiomatest;
public class Main {
public static void main(String[] args) {
//new 两个notSingle类的实例,并给里面的属性a赋值
Single s=Single.getInstance();
s.setA(3);
s.Show();
Single s1=Single.getInstance();
s1.Show();
}
}
class Single{
//私有化构造方法
private Single(){
}
//创建一个私有的本类对象
private static Single s=null;
//提供一个公共的方法获得该类的实例
public static Single getInstance(){
if(s==null){
synchronized(Single.class){
if(s==null){
s=new Single();
}
}
}
return s;
}
private int a;
public void setA(int a ){
this.a=a;
}
public void Show(){
System.out.println(this.a);
}
}
饿汉式和懒汉式的不同点:
饿汉式:直接先初始化对象。
懒汉式:对象是在方法被调用时,才初始化,也叫做对象的延时加载。 |
|