反射(java reflection)
在JDK中,主要由以下类来实现java反射机制,这些类都位于java.lang.reflect包中。
- Class类:代表一个类
- Constructor类:代表类的构造方法
- Field类:代表类的成员变量
- Method类:代表类的方法
语义分析
生活中的语义分析是一个优秀的方法,可以方便构建应用程序的框架。例如甲和乙关于工厂和工作的对话,如下所示。
甲:你在哪里上班?
乙:小汽车工厂。
甲:做什么工作?
乙:生产小汽车。
甲:生产几种小汽车?
乙:高、中、低档3中小汽车。
可以看出生活中语义描述事物的一个显著特点:范围从大到小,从泛泛到具体、从一般到特殊。因此计算机程序结构一定也要遵循这种结构,即按层次划分。
工厂模式
工厂模式一般分为简单工厂、工厂、抽象工厂3种情况,属于创建型设计模式。
简单工厂模式:
(1)定义小汽车接口
public interface ICar{
}
(2)下面定义高、中、低档具体的小汽车
public class TopCar implements ICar{
}
public class MidCar implements ICar{
}
public class LowCar implements ICar{
}
(3) 简单工厂:CarSimpleFactory.java
使用简单工厂的时候,没有创建简单工厂类的示例的必要。因此,可以把简单工厂类实现成一个工具类,直接使用静态方法就可以了。
public class CarSimpleFactory{
public static final String TOPTYPE="toptype";
public static final String MIDTYPE="midtype";
public static final String LOWTYPE="lowtype";
// 简单工厂的方法通常是静态的,所以也被称为静态工厂。
// 如果要防止客户端无谓地创造简单工厂示例,还可以把简单工厂的构造方法私有化。
public static ICar create(String mark){
ICar obj=null;
if(mark.equals(TOTYPE)){ //如果是高档车类型
obj=new TopCar(); //则创建高档车对象
}
if(mark.euqals(MIDTYPE)){
obj=new MidCar();
}
else if(mark.equals(LOWTYPE)){
obj=new LowCar();
}
return obj; //返回选择的对象
}
// 测试
public static void main(String[] args){
//从工厂中创建对象
ICar obj=CarSimpleFactory.create("toptype");
}
}
抽象工厂模式
(1)问:能否不修改工厂类就能新增一个超高档类型的汽车?
答:可以把工厂类设计为抽象类,再设计高中低档类型的子工厂类去继承它,由这些子工厂类去创建各自对应的高中低档类型汽车对象。如下:
(2)定义小汽车接口
public interface ICar{
}
(3)定义抽象工厂
public abstract class AbstractFactory {
public abstract ICar create(); / /抽象的创建方法
}
(4)下面定义高、中、低档具体的小汽车
public class TopCar implements ICar{
}
public class MidCar implements ICar{
}
public class LowCar implements ICar{
}
(5)下面定义高、中、低档具体的小汽车工厂
//子工厂继承抽象工厂
public class TopFactory extends AbstractFactory{
//高档工厂生成高档小汽车对象
public ICar create(){
return TopCar();
}
// 测试
public static void main(String[] args){
AbstractFactory obj=new TopFactory(); //多态创建高档工厂
ICar car = obj.create(); //获得高档工厂中创建的高档小汽车对象
}
}
为什么使用抽象类:
抽象类为子类提炼出公共的方法,并提供一个或几个抽象方法留给子类实现;
抽象类的设计体现了模板模式的设计思想,即抽象类的普通方法依赖一个抽象方法,而抽象方法则推迟到子类中实现细节。