工厂方法模式:
定义:
定义一个用于创建对象的接口,让子类决定实例化哪一个类。
工厂方法使用一个类的实例化延迟到子类。
举个栗子:我们要生产水果罐头,我们应该怎么做呢?
首先,我们须要准备好原料。其次我们须要一个罐头工厂,往工厂里运送不同的原料,出来的就是不同的罐头。
原料就是苹果啊、橘子啊等等的这些类。
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();
}
}