java中共有23种设计模式:前人不断改善某以功能代码,最后形成了一种最简单,最通用的编写方式,人们把这种定义模式叫做设计模式
多态存在的问题:虽然当想访问对象的时候不用更改方法,直接改实例就可以,但是如果创建实例太多的时候,也会变得麻烦起来
简单静态工厂模式
使用工厂类创建对象,之后通过调用工厂方法进行创建对象
优点:1.提高安全性
2.便于程序扩展
3.提高工作性能
1.在工厂类中写一个静态获取对象的方法
public class Factory {
public static Person getP(){
return new Student() ;
}
}
2.调用方法的时候通过调用工厂类的静态方法获取对象,这样更改获取对象的时候,只改工厂类的静态方法就可以
单例模式:单实例,一个类只能创建一个对象
饿汉式(很饿,一开始就要创建)
1,创建私有的静态的本类对象变量。
2,私有构造方法
3,对外提供一个静态方法,用来获取该对象
private static Student s=new Student();
private Student(){}
public static Student getS(){
return s;
}
懒汉式(很懒用的时候再创建)
1,创建私有的静态本类变量(不引用对象)
2.私有构造方法
3.对外提供一个静态方法,用来获取该对象,如果本类引用的为空创建一个对象,如果不为空返回该对象
private Teacher t;
private Teacher(){}
public Teacher getT(){
if(t==null){
t=new Teacher();
}
return t;
}
单例模式顾名思义就是为了只创建一个对象,在不考虑多线程的时候我们通过一个if就可以解决这个问题了,但是如果有多个线程创建对象的话,可能会同时进入方法,在第一个线程没有创建完对象的时候,第二个线程完成了是否有对象的判断,这样第二个线程也会发现没有对象,也会去创建对象,这样就会创建两个对象了,由此我们使用同步代码块,解决了在第一个线程没有创建对象完毕,第二个线程是不会去判断是否有对象的。当使用同步代码块后,第一个线程进入之后发现没有对象,就创建了一个,之后的所有线程都要排着队去判断是否已经存在对象了,这样是十分慢的,我们想要在第一个线程创建完对象之后,之后所有的线程可以一起去判断有没有对象,我们就引入了第二个if用来避开同步代码块。
如果没有第二个if 经过第一个if的判断两个线程发现都没有对象,所以都进入了到if里了,之后第一个线程创建了一个对象之后,由于内部并没有判断,第二个线程又创建一个对象。而如果有了内部的if判断的话,第一个线程进入后判断对象为空创建对象,这时候有了对象了,第二个线程进入后发现有对象了了,就会直接return已经创建的对象,没有第二个if同步代码块内只有一条语句,失去了同步的意义,相当于没有同步代码块。没对象需要同步访问,有对象可以异步访问速度快
第二个if解决的是在没有对象的时候,当很多线程都到达了方法前准备访问方法的时候,所有线程会排队访问,在这时只有第一个线程会创建对象,保证了多线程下的对象的唯一性;第一个if是为了解决当有了一个对象之后,将新来的线程拦截在外边,防止多线程访问同步代码块,出现多线程排队去判断是否已经存在对象的问题
第一个if解决效率,第二个if解决同步问题。(同步代码效率低)
在实际开发过程中一般使用饿汉,懒汉虽然节约内存,每次使用都要创建对象,消耗时间