.class和Class.forName()
有時候需要獲得Class對象的引用,可以通過類名.class或者Class.forName("類名")來獲得。兩者的差別是,使用.class來建立對Class對象的引用時,不會自動地初始化該Class對象,而Class.forName()會。
RTTI和反射機制
RTTI:運作時類型資訊(Run-Time Type Information)
RTTI和反射之間的差別在于,對RTTI來說,編譯器在編譯時打開和檢查.class檔案,而對反射機制來講,.class檔案在編譯時是不可擷取的,是以是在運作時打開和檢查.class檔案。
工廠方法
1. 簡單工廠
public abstract class Shape {
private String name;
public abstract void draw();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Shape(String name) {
super();
this.name = name;
}
}
public class Circle extends Shape {
public Circle(String name) {
super(name);
}
@Override
public void draw() {
System.out.printf("draw %s.\n", this.getName());
}
}
public class Square extends Shape {
public Square(String name) {
super(name);
}
@Override
public void draw() {
System.out.printf("draw %s.\n", this.getName());
}
}
public class SimpleFactory {
public static Shape drawShape(String shapeType) {
if (shapeType == null || "".equals(shapeType))
return null;
if ("circle".equalsIgnoreCase(shapeType)) {
return new Circle(shapeType);
} else if ("square".equalsIgnoreCase(shapeType)) {
return new Square(shapeType);
}
return null;
}
// 測試方法
public static void main(String[] args) {
Shape circle = SimpleFactory.drawShape("circle");
circle.draw();
Shape square = SimpleFactory.drawShape("square");
square.draw();
}
}
2. 工廠方法
增加一個ShapeFactory抽象類,CircleFactory和SquareFactory均繼承自ShapeFactory,來實作擷取Shape的功能,分離出簡單工廠中的SimpleFactory的if else判斷。
public abstract class ShapeFactory {
public abstract Shape drawShape(String shapeType);
}
public class CircleFactory extends ShapeFactory {
@Override
public Shape drawShape(String shapeType) {
return new Circle(shapeType);
}
}
public class SquareFactory extends ShapeFactory {
@Override
public Shape drawShape(String shapeType) {
return new Square(shapeType);
}
}
public static void main(String[] args) {
ShapeFactory abstractDraw = new CircleFactory();
Shape circle = abstractDraw.drawShape("circle");
circle.draw();
}
3. 抽象工廠
新增加和Shape同一級别的Color,添加一個AbstractFactory來擷取Shape和Color,添加一個FactoryProducer來擷取ShapeFactory或ColorFactory。
public abstract class Color {
private String name;
public abstract void fill();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Color(String name) {
super();
this.name = name;
}
}
public class Blue extends Color {
public Blue(String name) {
super(name);
}
@Override
public void fill() {
System.out.printf("fill %s color.\n", this.getName());
}
}
public class Red extends Color {
public Red(String name) {
super(name);
}
@Override
public void fill() {
System.out.printf("fill %s color.\n", this.getName());
}
}
public abstract class AbstractFactory {
public abstract Color getColor(String color);
public abstract Shape getShape(String shapeType);
}
public class ColorFactory extends AbstractFactory {
@Override
public Color getColor(String color) {
if (color == null || "".equals(color))
return null;
if ("red".equalsIgnoreCase(color)) {
return new Red(color);
} else if ("blue".equalsIgnoreCase(color)) {
return new Blue(color);
}
return null;
}
@Override
public Shape getShape(String shapeType) {
return null;
}
}
public class ShapeFactory extends AbstractFactory {
@Override
public Color getColor(String color) {
return null;
}
@Override
public Shape getShape(String shapeType) {
if (shapeType == null || "".equals(shapeType))
return null;
if ("circle".equalsIgnoreCase(shapeType)) {
return new Circle(shapeType);
} else if ("square".equalsIgnoreCase(shapeType)) {
return new Square(shapeType);
}
return null;
}
}
public class FactoryProducer {
public static AbstractFactory getFactory(String choice) {
if (choice == null || "".equals(choice))
return null;
if ("shape".equalsIgnoreCase(choice)) {
return new ShapeFactory();
} else if ("color".equalsIgnoreCase(choice)) {
return new ColorFactory();
}
return null;
}
public static void main(String[] args) {
AbstractFactory shapeFactory = FactoryProducer.getFactory("shape");
Shape circle = shapeFactory.getShape("circle");
circle.draw();
AbstractFactory colorFactory = FactoryProducer.getFactory("color");
Color red = colorFactory.getColor("red");
red.fill();
}
}