天天看點

第十四章 類型資訊

.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();
	}
}