1.设计模式
设计模式:一套被反复使用、多数人知晓的,经过分类编目的、代码设计经验的总结,是软件开发人员在软件开发过程中面临的一般问题的解决方案。
- 项目中合理的运用设计模式可以完美的解决很多问题;
- 每种模式在现实中都有相应的原理来与之对应;
- 每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案。
23种基础模式
单例模式
要点:
- 某个类只能有一个实例;
- 必须自行创建实例;
- 必须自行向整个系统提供这个实例
实现:
- 只提供私有的构造方法;
- 含有一个该类的静态私有对象;
- 提供一个静态的公有方法用于创建、获取静态私有对象。
饿汉式:在创建类的同时实例化对象,以空间(内存中存在周期长)换时间(类加载比较快),线程比较安全
package com.imooc.singletonProj;
/*** 饿汉式:创建对象实例的时候直接初始化*/
public class SingletonOne {//1.私有构造方法private SingletonOne(){}//2.该类型私有静态实例private static SingletonOne instance =new SingletonOne();//3.静态共有方法用于创建、获取静态私有对象public static SingletonOne getInstance(){return instance;}
}
懒汉式:懒汉式:不直接创建静态实例,而是在使用的时候调用静态getter方法完成初始化,用时间换空间,存在线程风险
package com.imooc.singletonProj;
public class SingletonTwo {//1.私有构造方法private SingletonTwo(){}//2.该类型私有静态实例private static SingletonTwo instance=null;//3.创建开放的静态方法提供实例对象public static SingletonTwo getInstance(){if(instance==null)instance=new SingletonTwo();return instance;}
}
单例模式的优点:
- 在内存中只有一个对象,节省内存空间;
- 避免频繁创建销毁对象,提高性能;
- 避免对共享资源的多重占用
单例模式的缺点:
- 扩展困难;
- 如果实例化后的对象长期不利用,系统将默认为垃圾进行回收,造成对象状态丢失
使用场景:
- 创建对象时占用资源过多,但同时又需要用到这类对象;
- 对系统内资源要求统一读写,如读写配置信息;
- 当多个实例存在可能引起程序逻辑错误,如号码生成器。
说实话,以上的内容不是太懂,可能学的还是不够深入
2.抽象(类、方法)
2.1 抽象类
如同之前的继承中的例子,父类Animal可以进行实例化,并执行吃的行为
Animal pet=new Animal("花花",2)
pet.eat()
程序运行没有问题,但是实际逻辑上应该是其子类(Cat or Dog)来执行对应的动物各自特殊的 吃的行为,因此使用 abstract
不允许实例化父类来避免写出上述没有意义的代码。防止父类和无意义实例化和子类设计的随意性,父类就是个 工具类(工具人)
抽象类应用场景:某个父类只是知道其子类应该包含怎样的方法,但无法准确知道这些子类如何实现这些方法。
2.2 抽象方法
父类中的方法被子类重写,因此父类的方法没有用,需要用 abstract
修饰方法,称之为 抽象方法,且没有方法体。使其无法调用,并且要求子类重写方法。否则,子类也需要成为抽象类才不用重写。
抽象类和抽象方法的存在是提醒编写者需要重写父类有,但是需要子类的重写的方法。
使用规则:
- abstract定义抽象类;
- 抽象类不能直接实例化,只能被继
- 承,可以通过向上转型完成对象实例化
- 包含抽象方法的必须是抽象类,但是抽象类可以没有抽象方法;
- static final private 与abstract无法共存;
- 可以定义一个抽象类的对象变量,但是只能引用非抽象子类的对象,即向上转型
Person p = new Strudent()
2.3 总结
抽象类禁止了父类被无效的实例化,而抽象方法则要求子类继承后必须重写(除非子类也是abstract),一代一代传下去,谁真正继承,谁重写。
只有抽象方法才需要重写,抽象类中的非抽象方法不需要重写,这是抽象类与接口的不同的其中一点。
抽象类将 设计 与 实现 相分开,谁继承,谁再具体实现,这就是抽象类存在的意义。