Java 类初始化顺序
基本分为以下几种:静态块,初始化块,静态方法,构造函数块,静态变量,成员变量
对于块顺序,静态块 > 初始化块 > 构造块
对于变量,静态变量 > 成员变量
对于同级的块,按照源码顺序来初始化
变量和块一起考虑:构造函数块一定在父类构造函数,成员变量初始化,初始化块之后。将这三个部分一起并入本构造函数中
一般类实例化过程:类加载+链接,类初始化,类实例化
转一道复杂的考题(深刻解析):<a>http://biaobiaoqi.github.io/blog/2013/09/22/java-initialization/</a>
三种工厂模式:简单工厂,工厂模式,抽象工厂
设计模式的三大原则:开放-封闭(对扩展开放,对修改封闭),单一职责,依赖倒转(它是开闭原则的前提,对于各个模块间交互都是抽象,抽象不依赖于实现细节,细节依赖抽象)
简单工厂
三个主要部分,工厂类(用于生成所有可能的类实例),实例的接口类(用于定义功能相似的抽象方法),具体类(实现具体功能的类)
Class Factory(根据输入参数,一般通过switch来判定并实例化对应的类对象。但是可以用反射避免修改工厂类,可以保证"开放-封闭"原则,解除判断分支间的耦合)
interface Fruit
Class Apple,Class Orange,Class Banana
工厂模式
其实就是在简单工厂上对工厂类进行一层抽象,让特定工厂生成特定实例,利用多态的性质,比简单工厂多定义一个工厂类接口。
interface Factory
Class AppleFactory Class OrangeFactory Class BananaFactory(这些工厂类实现工厂接口中方法,主要是实例化具体类,直接new Apple,new Orange...)
interface Fruit
Class Apple Class Orange Class Banana(实现水果接口中的方法)
抽象工厂
多个不同工厂的条件下,再一次抽象。还没想到合适的例子
策略模式
- 类似简单工厂,但是明显的区别在于将策略的实例化选择交给了客户端自身来判断(需要指定具体类给一个抽象类对象),简单工厂是将该部分交给服务端判断(只需要传入参数即可,不用考虑会实例化哪一个具体类)
- 实现最好用抽象类而不用接口,这样可以将公用的方法放到抽象类中.
- 运行期间,策略模式在每一个时刻只能使用一个具体的策略实现对象,虽然可以动态地在不同的策略实现中切换,但是同时只能使用一个
建造者模式
- 一个指挥者类,需要传入构建的builder实例作为指挥者构造函数的形参(就是告诉建造者应该建造什么类型的实例)
一个抽象类buidler,负责抽象出各个具体类的公共建造方法
多个具体类,分别重写实现抽象类中的方法
-
也可以使用接口的方式,具体类去实现接口定义的方法。同时具体builder类中一般有一个继承了基类产品的product成员。
UML类图: