1. 程式人生 > >設計模式(2):工廠方法模式

設計模式(2):工廠方法模式

sys 實例化 不同 err reat inter 設計 end 泛型

工廠方法模式:

?

定義:

?

定義一個用於創建對象的接口,讓子類決定實例化哪一個類。

工廠方法使用一個類的實例化延遲到子類。

?

舉個栗子:我們要生產水果罐頭,我們應該怎麽做呢?

首先,我們須要準備好原料。其次我們須要一個罐頭工廠,往工廠裏運送不同的原料,出來的就是不同的罐頭。

?

原料就是蘋果啊、橘子啊等等的這些類。

?

interface IFruits {
	public void taste();
}

class Apple implements IFruits {

	public void taste() {
		System.out.println("I‘m apple");
	}
}

class Orange implements IFruits {

	public void taste() {
		System.out.println("I‘m orange");
	}
}


?

工廠呢就是可以生產水果罐頭的工廠啊。

?

abstract class AbstractFactory {
	// 採用泛型對輸入參數進行限制:
	// 1.必須是Class類型
	// 2.必須是IFruits類型的子類
	public abstract <T extends IFruits> T createCan(Class<T> c);
}

class Factory extends AbstractFactory {


	@Override
	public <T extends IFruits> T createCan(Class<T> c) {
		IFruits fruits = null;

		try {
			fruits = (IFruits) Class.forName(c.getName()).newInstance();
		} catch (Exception e) {
			e.printStackTrace();
		}

		return (T) fruits;
	}

}


?

場景類:

?

public class Client {

	public static void main(String[] args) {
		AbstractFactory factory = new Factory();
		IFruits apple = factory.createCan(Apple.class);
		apple.taste();
		IFruits orange = factory.createCan(Orange.class);
		orange.taste();
	}
}

?

?

書中的樣例:女媧造人,產生各種膚色的人。

?

package ne;

interface Human {
	public void say();
}

class Black_human implements Human {

	public void say() {
		System.out.println("I‘m black");
	}
}

class Yellow_human implements Human {

	public void say() {
		System.out.println("I‘m yellow");
	}

}

abstract class AbstractFactory {
	public abstract <T extends Human> T createHuman(Class<T> c);
}

class Factory extends AbstractFactory {

	@Override
	public <T extends Human> T createHuman(Class<T> c) {
		Human human = null;
		try {
			human = (Human) Class.forName(c.getName()).newInstance();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return (T) human;
	}
}

public class Client {
	public static void main(String[] args) {
		AbstractFactory factory = new Factory();
		Human black_human = factory.createHuman(Black_human.class);
		Human yellow_human = factory.createHuman(Yellow_human.class);
		black_human.say();
		yellow_human.say();
	}
}


?

?

?


?

設計模式(2):工廠方法模式