javase第十讲关于接口、单例模式

接口

1、接口中所声明的方法都是抽象方法。接口中的方法都是public的。
所有具体写法一般是这样的:public static final int a=1;但是通常情况下直接写成int a=1;

2、接口中也可以定义成员变量。接口中的成员变量都是public、final、static的。【很少有情况在接口里面定义属性,一般都是在接口中定义方法的】,接口主要是起到一个约束的作用,主要是定义一个规则比如访问修饰符、返回类型等。

3、一个类不能既是final,又是abstract的。因为abstract的主要目的是定义一种约束,让子类去实现这种约束,而final表示该类不能被继承,这样abstract希望该类被继承,而final是不能被继承,两者矛盾,故不能在一起使用。

设计模式

设计模式(design pattern):设计模式不是一种技术,而是解决问题的方式,不局限于java,任何面向对象的语言都可以实现,而且大量依托于多态,设计模式是一种思想,经典的设计模式有23种。

单例模式

单例模式(singleton):表示一个类只会生成唯一的一个对象。单例即只有一个实例。

单例模式设计思路:
1)一个类生成一个对象,new出一个实例的时候势必会调用一次构造方法。
2) 如果提供了构造方法,并且用private修饰这个构造方法,则这个构造方法只能在Singleton类里面访问,此时外面就不能new这个对象了。
3)对于private的构造方法,只能在内部访问,所以在类里面是可以new的,具体思路是在Singleton里面new出一个对象来,然后再提供一个方法,将这个对象想办法返回回来。然后在类的外部就不要new了就直接用提供的这个方法来接受返回回来的对象。
4)用static修饰,外部就可以直接以类名.方法的形式调用了。
程序:
public class SingletonTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Singleton singleton=Singleton.get();
}
}
class Singleton{
private Singleton() {
}
public static Singleton get(){
System.out.println(“厉害”);
return new Singleton();
}
}`
输出结果:
厉害

5)但是这种写法总是要get()方法返回一个new出来的对象,这就不满足单例的要求。可以先 生成一个对象,然后调用一次就返回这个生成好的对象。

public class SingletonTest {
public static void main(String[] args) {
		// TODO Auto-generated method stub
		Singleton singleton = Singleton.get();
	}
}
class Singleton {
	private static Singleton singleton = new Singleton();
	private Singleton() {
	}
	public static Singleton get() {
		return singleton;
	}
}

【说明】在Singleton类里面,new一个对象,调用私有构造方法,返回一个实例给singleton,然后在方法get()里面返回这个实例,但是程序报错,是因为get()方法是静态的,静态方法不能访问非静态方法,所有将 private Singleton singleton = new Singleton();改为 private static Singleton singleton = new Singleton();

判断这个程序是不是单例程序

方法一(饿汉式):
优点:不会产生对象没有就拿来用使用的问题(如空指针异常)
缺点:启动项目加载的对象过多,有些还没有使用,产生的服务器承载压力的问题。

public class SingletonTest {
	public static void main(String[]args){
		Singleton singleton=Singleton.get();
		Singleton singleton2=Singleton.get();
		System.out.println(singleton==singleton2);
	}
}
class Singleton{
	private static Singleton singleton=new Singleton();
	private Singleton(){
	}
	public static Singleton get(){
		return singleton;
	}
}

输出结果:
true
【说明】:如果这个实例singleton和singleton2是同一个实例,则这两个实例指向同一个对象则地址相同,所有输出true。

方法二(懒汉式):
优点:启动项目时只有需要的加载,不需要的还没有创建,不会浪费空间。
缺点:可能由于没有操作好,导致异常。

public class SingletonTest {
	public static void main(String[]args){
		Singleton singleton=Singleton.get();
		Singleton singleton2=Singleton.get();
		System.out.println(singleton==singleton2);
	}
}
class Singleton{
	private static Singleton singleton;
	private Singleton(){	
	}
	public static Singleton get(){
		if(singleton==null){
			singleton=new Singleton();
		}
		return singleton;
	}
}

输出结果:true
【说明】:这个程序是在get()里面添加一个判断,如果没有生产一个实例,则new出一个实例,如果已经生产一个实例,就是不为空,则返回这个实例。

这两种实现结果都是一样的,但是在多线程环境中,第一效果好,第二种可能产生差异。

发布了45 篇原创文章 · 获赞 38 · 访问量 2147

猜你喜欢

转载自blog.csdn.net/qq_44830627/article/details/105040892