什么是设计模式?
在大量的实践中总结和理论化之后优选的代码结构、编程风格以及解决问题的思考方式。(设计模式就是像是取最优的模板一样,类似英文作文模板。)
学习设计模式的目的:
使得开发项目更加容易扩展和维护,解决方式就是一个“分工”;在不改变原有代码的基础上实现扩展操作。
现阶段学习的设计模式仅做了解的设计模式:
单例模式(Singleton)是需要掌握的!!!
模板方法设计模式(TemplateMethod)/代理模式(Proxy)有些相像,学习的时候注意区分;
工厂模式,又分为了三大类,所以区别学习,注意抽象工模式涉及反射的内容,后续再补充...
单例模式(Singleton):
采用一定的方法保证在整个软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。
拆解主要内容:
对某个类只能存在一个对象实例->private类名(){} ->私有化构造器该类只提供一个取得其对象实例的方法->提供一个可以返回该对象的方法1.创建类2.私有化类的构造器3.创建一个类对象并将类封装起来4.创建一个能返回该类对象的方法5.必须保证该方法能通过类名获取到->声明为static方法->推断得第四步为static修饰的对象
饿汉式:
天然的线程安全,所以如下写法就是最标准的形式。
publicclassDemoSingleton { publicstaticvoidmain(String[] args) { Bank.getInstance(); } } //1.创建类classBank{ //2.私有化构造器privateBank(){ } //3.创建一个类对象并将类封装起来//5.因为静态方法只能使用静态的变量,所以该实例化对象也必须声明为static的privatestaticBankinstance=newBank(); //4.创建一个能返回该类对象的方法//我们需要这个方法返回该类的实例化对象,需要声明该方法为static,可以通过类名调用publicstaticBankgetInstance(){ returninstance; } }
饿汉式的好处:线程安全的;
饿汉式的缺点:对象的加载时间长,可能在调用getInstance()的时候才需要创建对象,但是在调用getInstance()前对象就是已存在。
懒汉式:
下面这种写法是存在安全隐患的,最为安全需要加上线程同步(synchronized)!
publicclassDemoSingleton { publicstaticvoidmain(String[] args) { Bank.getInstance(); } } //1.创建类classBank{ //2.私有化构造器privateBank(){ } //3.创建一个类对象并将类封装起来//5.因为静态方法只能使用静态的变量,所以该实例化对象也必须声明为static的privatestaticBankinstance=null; //4.创建一个能返回该类对象的方法//我们需要这个方法返回该类的实例化对象,需要声明该方法为static,可以通过类名调用publicstaticsynchronizedBankgetInstance(){//此时同步监视器就是Bank.classif (instance==null) { instance=newBank(); } returninstance; /*public static Bank getInstance(){//这种效率会相对高一点,因为如果instance != null后,后续的线程就可以直接拿到对象,不用在抢占锁了if (instance == null) {synchronized (Bank.class) {if (instance == null) {instance = new Bank();}}}return instance;}*/}
懒汉式的好处:延迟对象的创建;
懒汉式的局限:天然的线程不安全,需要后续进行线程同步。
饿汉式和懒汉式在面试的时候可能会让手写代码所以建议掌握!!!
另外,饿汉式是天然线程安全的,所以不用额外担心安全隐患的问题;但是在书写懒汉式要保证线程安全!!!