案例(原文链接):
一.工厂模式
即定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
1.1.
定义了人的接口,内含两个抽象方法。
public interface Human {
public void getColor();//人有不同的颜色
public void talk(); //人会说话
}
1.2.
定义了三个类,三个类都实习Human接口
public class YellowHuman implements Human{
@Override
public void getColor() {
System.out.println("Yellow");
}
@Override
public void talk() {
System.out.println("Yellow man");
}
}
public class WhiteHuman implements Human{
@Override
public void getColor() {
System.out.println("White");
}
@Override
public void talk() {
System.out.println("White man");
}
}
public class BlackHuman implements Human{
@Override
public void getColor() {
System.out.println("Black");
}
@Override
public void talk() {
System.out.println("Black man");
}
}
1.3.
定义抽象类工厂
public abstract class AbstractHumanFactory {
public abstract <T extends Human> T createHuman(Class<T> clazz); //注意这里T必须是Human的实现类才行,因为要造Human嘛
}
1.4.
clazz.getName()).newInstance()
创建了clazz类型的实例。
public class HumanFactory extends AbstractHumanFactory{
@Override
public <T extends Human> T createHuman(Class<T> clazz) {
Human human = null;
try {
human = (Human) Class.forName(clazz.getName()).newInstance();
} catch (Exception e) { //异常处理
System.out.println("人种产生错误");
}
return (T) human;
}
}
1.5.测试
YellowHuman.class
上执行结果:
public class FactoryTest {
public static void main(String[] args) {
AbstractHumanFactory bagualu = new HumanFactory();
Human blackMan = bagualu.createHuman(BlackHuman.class); //黑人诞生了
Human yellowMan = bagualu.createHuman(YellowHuman.class); //黄人诞生了
Human whiteMan = bagualu.createHuman(WhiteHuman.class); //白人诞生了
}
}
二.工厂模式扩展
2.1静态工厂模式
现在只需要一个工厂就可以把人生产出来,不需要要具体的工厂对象,只要使用静态方法。把AbstractHumanFactory抽象类去掉,只保留了HumanFactory类,同时把createHuman方法设置成了static类型。
不用new对象,直接用HumanFactory类调用即可。
public class HumanFactory {
@Override
public static <T extends Human> T createHuman(Class<T> clazz) {
Human human = null;
try {
human = (Product) Class.forName(clazz.getName()).newInstance();
} catch (Exception e) { //异常处理
System.out.println("人种产生错误");
}
return (T) human;
}
}
Human blackMan = HumanFactory.createHuman(BlackHuman.class);
在实际项目中,根据需求可以设置成静态工厂类,缺点是扩展比较困难。
2.2多个工厂模式
不同的工厂创建不通过的产品。
public abstract class AbstractHumanFactory {
public abstract Human createHuman();
}
public class YellowHumanFactory extends AbstractHumanFactory{
@Override
public Human createHuman() {
return new YellowHuman();
}
}
public class WhiteHumanFactory extends AbstractHumanFactory{
public Human createHuman() {
return new WhiteHuman();
}
}
public class BlackHumanFactory extends AbstractHumanFactory{
@Override
public Human createHuman() {
return new BlackHuman();
}
}